@brainfish-ai/devdoc 0.1.26 → 0.1.28

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.
@@ -0,0 +1,6 @@
1
+ type AITool = 'claude' | 'cursor' | 'both';
2
+ interface AIOptions {
3
+ tool?: AITool;
4
+ }
5
+ export declare function ai(options: AIOptions): Promise<void>;
6
+ export {};
@@ -0,0 +1,280 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.ai = ai;
40
+ const path_1 = __importDefault(require("path"));
41
+ const fs_extra_1 = __importDefault(require("fs-extra"));
42
+ const logger_1 = require("../../utils/logger");
43
+ // Simple prompt helper using readline
44
+ async function prompt(question, defaultValue) {
45
+ const readline = await Promise.resolve().then(() => __importStar(require('readline')));
46
+ const rl = readline.createInterface({
47
+ input: process.stdin,
48
+ output: process.stdout,
49
+ });
50
+ return new Promise((resolve) => {
51
+ const displayQuestion = defaultValue
52
+ ? `${question} (${defaultValue}): `
53
+ : `${question}: `;
54
+ rl.question(displayQuestion, (answer) => {
55
+ rl.close();
56
+ resolve(answer.trim() || defaultValue || '');
57
+ });
58
+ });
59
+ }
60
+ async function promptSelect(question, choices) {
61
+ console.log(`\n${question}\n`);
62
+ choices.forEach((choice, i) => {
63
+ console.log(` ${i + 1}. ${choice.label}`);
64
+ });
65
+ console.log();
66
+ const readline = await Promise.resolve().then(() => __importStar(require('readline')));
67
+ const rl = readline.createInterface({
68
+ input: process.stdin,
69
+ output: process.stdout,
70
+ });
71
+ return new Promise((resolve) => {
72
+ rl.question('Enter number: ', (answer) => {
73
+ rl.close();
74
+ const index = parseInt(answer.trim(), 10) - 1;
75
+ if (index >= 0 && index < choices.length) {
76
+ resolve(choices[index].value);
77
+ }
78
+ else {
79
+ // Default to first choice
80
+ resolve(choices[0].value);
81
+ }
82
+ });
83
+ });
84
+ }
85
+ // Claude Code skills to create
86
+ const CLAUDE_SKILLS = [
87
+ 'bootstrap-docs',
88
+ 'migrate-docs',
89
+ 'import-api-spec',
90
+ 'sync-docs',
91
+ 'check-docs',
92
+ 'create-doc-page',
93
+ 'update-docs-json',
94
+ 'generate-api-docs',
95
+ 'docs-from-code',
96
+ ];
97
+ // Cursor rules to create
98
+ const CURSOR_RULES = [
99
+ 'devdoc.mdc',
100
+ 'devdoc-bootstrap.mdc',
101
+ 'devdoc-migrate.mdc',
102
+ 'devdoc-sync.mdc',
103
+ ];
104
+ /**
105
+ * Get the template directory path (handles both development and installed package scenarios)
106
+ */
107
+ function getTemplateDir() {
108
+ // Try relative to this file (packages/devdoc/src/cli/commands -> packages/devdoc/templates)
109
+ let templateDir = path_1.default.join(__dirname, '..', '..', '..', 'templates', 'starter');
110
+ if (fs_extra_1.default.existsSync(templateDir)) {
111
+ return templateDir;
112
+ }
113
+ // Try devdoc/templates at repo root (development - monorepo structure)
114
+ // __dirname is packages/devdoc/src/cli/commands -> go up 5 levels to repo root
115
+ templateDir = path_1.default.join(__dirname, '..', '..', '..', '..', '..', 'devdoc', 'templates', 'starter');
116
+ if (fs_extra_1.default.existsSync(templateDir)) {
117
+ return templateDir;
118
+ }
119
+ // Try node_modules location (installed package)
120
+ templateDir = path_1.default.join(__dirname, '..', '..', 'templates', 'starter');
121
+ if (fs_extra_1.default.existsSync(templateDir)) {
122
+ return templateDir;
123
+ }
124
+ throw new Error('Could not find template directory');
125
+ }
126
+ /**
127
+ * Copy CLAUDE.md to project root
128
+ */
129
+ function copyClaudeMd(projectPath, templateDir) {
130
+ const sourcePath = path_1.default.join(templateDir, 'CLAUDE.md');
131
+ const destPath = path_1.default.join(projectPath, 'CLAUDE.md');
132
+ if (!fs_extra_1.default.existsSync(sourcePath)) {
133
+ logger_1.logger.warn('CLAUDE.md template not found');
134
+ return false;
135
+ }
136
+ fs_extra_1.default.copySync(sourcePath, destPath);
137
+ return true;
138
+ }
139
+ /**
140
+ * Copy Claude Code skills to .claude/skills/
141
+ */
142
+ function copyClaudeSkills(projectPath, templateDir) {
143
+ const copied = [];
144
+ const sourceSkillsDir = path_1.default.join(templateDir, '.claude', 'skills');
145
+ const destSkillsDir = path_1.default.join(projectPath, '.claude', 'skills');
146
+ if (!fs_extra_1.default.existsSync(sourceSkillsDir)) {
147
+ logger_1.logger.warn('Claude skills template directory not found');
148
+ return copied;
149
+ }
150
+ // Ensure destination directory exists
151
+ fs_extra_1.default.ensureDirSync(destSkillsDir);
152
+ for (const skill of CLAUDE_SKILLS) {
153
+ const sourceDir = path_1.default.join(sourceSkillsDir, skill);
154
+ const destDir = path_1.default.join(destSkillsDir, skill);
155
+ if (fs_extra_1.default.existsSync(sourceDir)) {
156
+ fs_extra_1.default.copySync(sourceDir, destDir);
157
+ copied.push(skill);
158
+ }
159
+ }
160
+ return copied;
161
+ }
162
+ /**
163
+ * Copy Cursor rules to .cursor/rules/
164
+ */
165
+ function copyCursorRules(projectPath, templateDir) {
166
+ const copied = [];
167
+ const sourceRulesDir = path_1.default.join(templateDir, '.cursor', 'rules');
168
+ const destRulesDir = path_1.default.join(projectPath, '.cursor', 'rules');
169
+ if (!fs_extra_1.default.existsSync(sourceRulesDir)) {
170
+ logger_1.logger.warn('Cursor rules template directory not found');
171
+ return copied;
172
+ }
173
+ // Ensure destination directory exists
174
+ fs_extra_1.default.ensureDirSync(destRulesDir);
175
+ for (const rule of CURSOR_RULES) {
176
+ const sourcePath = path_1.default.join(sourceRulesDir, rule);
177
+ const destPath = path_1.default.join(destRulesDir, rule);
178
+ if (fs_extra_1.default.existsSync(sourcePath)) {
179
+ fs_extra_1.default.copySync(sourcePath, destPath);
180
+ copied.push(rule);
181
+ }
182
+ }
183
+ return copied;
184
+ }
185
+ async function ai(options) {
186
+ console.log();
187
+ logger_1.logger.info('DevDoc AI Agent Setup');
188
+ console.log();
189
+ const projectPath = process.cwd();
190
+ // Check if this is a DevDoc project
191
+ const docsJsonPath = path_1.default.join(projectPath, 'docs.json');
192
+ const hasDocsJson = fs_extra_1.default.existsSync(docsJsonPath);
193
+ if (!hasDocsJson) {
194
+ logger_1.logger.warn('No docs.json found. This may not be a DevDoc project.');
195
+ console.log();
196
+ }
197
+ // Get template directory
198
+ let templateDir;
199
+ try {
200
+ templateDir = getTemplateDir();
201
+ }
202
+ catch {
203
+ logger_1.logger.error('Could not find AI agent templates. Please ensure DevDoc is installed correctly.');
204
+ process.exit(1);
205
+ }
206
+ // Get tool selection if not provided
207
+ let tool = options.tool || 'both';
208
+ if (!options.tool) {
209
+ const toolChoices = [
210
+ { value: 'both', label: 'Both - Claude Code and Cursor' },
211
+ { value: 'claude', label: 'Claude Code - Skills and CLAUDE.md' },
212
+ { value: 'cursor', label: 'Cursor - Rules (.cursor/rules/)' },
213
+ ];
214
+ tool = await promptSelect('Which AI tool do you use?', toolChoices);
215
+ }
216
+ console.log();
217
+ logger_1.logger.info('Setting up AI agent configuration...');
218
+ console.log();
219
+ const results = {
220
+ claudeMd: false,
221
+ claudeSkills: [],
222
+ cursorRules: [],
223
+ };
224
+ // Setup Claude Code
225
+ if (tool === 'claude' || tool === 'both') {
226
+ // Copy CLAUDE.md
227
+ results.claudeMd = copyClaudeMd(projectPath, templateDir);
228
+ if (results.claudeMd) {
229
+ logger_1.logger.success('Created CLAUDE.md');
230
+ }
231
+ // Copy skills
232
+ results.claudeSkills = copyClaudeSkills(projectPath, templateDir);
233
+ for (const skill of results.claudeSkills) {
234
+ logger_1.logger.success(`Created .claude/skills/${skill}/SKILL.md`);
235
+ }
236
+ }
237
+ // Setup Cursor
238
+ if (tool === 'cursor' || tool === 'both') {
239
+ results.cursorRules = copyCursorRules(projectPath, templateDir);
240
+ for (const rule of results.cursorRules) {
241
+ logger_1.logger.success(`Created .cursor/rules/${rule}`);
242
+ }
243
+ }
244
+ // Summary
245
+ console.log();
246
+ logger_1.logger.success('AI agent configuration complete!');
247
+ console.log();
248
+ if (tool === 'claude' || tool === 'both') {
249
+ console.log('Available Claude Code commands:');
250
+ console.log(' /bootstrap-docs - Analyze repo and generate initial documentation');
251
+ console.log(' /migrate-docs - Migrate from Mintlify, Docusaurus, GitBook, etc.');
252
+ console.log(' /import-api-spec - Import OpenAPI, GraphQL, or AsyncAPI specs');
253
+ console.log(' /sync-docs - Find and fix outdated documentation');
254
+ console.log(' /check-docs - Quick health check without changes');
255
+ console.log(' /create-doc-page - Create a new documentation page');
256
+ console.log(' /update-docs-json - Add pages to navigation');
257
+ console.log(' /generate-api-docs - Generate API documentation');
258
+ console.log(' /docs-from-code - Generate docs from specific code files');
259
+ console.log();
260
+ }
261
+ if (tool === 'cursor' || tool === 'both') {
262
+ console.log('Cursor rules configured for *.mdx files.');
263
+ console.log();
264
+ console.log('Suggested prompts in Agent mode:');
265
+ console.log(' "Analyze this repo and generate initial documentation"');
266
+ console.log(' "Migrate my Mintlify docs to DevDoc format"');
267
+ console.log(' "Check my docs for outdated content"');
268
+ console.log(' "Create a new guide about authentication"');
269
+ console.log();
270
+ }
271
+ console.log('Quick start:');
272
+ if (tool === 'claude' || tool === 'both') {
273
+ console.log(' Claude Code: /bootstrap-docs');
274
+ }
275
+ if (tool === 'cursor' || tool === 'both') {
276
+ console.log(' Cursor: Ask "generate initial documentation from this repo"');
277
+ }
278
+ console.log();
279
+ }
280
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2FpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUxBLGdCQTZHQztBQWxTRCxnREFBd0I7QUFDeEIsd0RBQTBCO0FBQzFCLCtDQUE0QztBQVE1QyxzQ0FBc0M7QUFDdEMsS0FBSyxVQUFVLE1BQU0sQ0FBQyxRQUFnQixFQUFFLFlBQXFCO0lBQzNELE1BQU0sUUFBUSxHQUFHLHdEQUFhLFVBQVUsR0FBQyxDQUFDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUM7UUFDbEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtLQUN2QixDQUFDLENBQUM7SUFFSCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDN0IsTUFBTSxlQUFlLEdBQUcsWUFBWTtZQUNsQyxDQUFDLENBQUMsR0FBRyxRQUFRLEtBQUssWUFBWSxLQUFLO1lBQ25DLENBQUMsQ0FBQyxHQUFHLFFBQVEsSUFBSSxDQUFDO1FBRXBCLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdEMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxLQUFLLFVBQVUsWUFBWSxDQUFDLFFBQWdCLEVBQUUsT0FBMkM7SUFDdkYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUM7SUFDL0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0s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LENBQUMsR0FBRyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDeEQsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsMERBQTBELENBQUMsQ0FBQztRQUN4RSxPQUFPLENBQUMsR0FBRyxDQUFDLCtDQUErQyxDQUFDLENBQUM7UUFDN0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sQ0FBQyxHQUFHLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUMzRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDNUIsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUN6QyxPQUFPLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUNELElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDekMsT0FBTyxDQUFDLEdBQUcsQ0FBQywrREFBK0QsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5cbnR5cGUgQUlUb29sID0gJ2NsYXVkZScgfCAnY3Vyc29yJyB8ICdib3RoJztcblxuaW50ZXJmYWNlIEFJT3B0aW9ucyB7XG4gIHRvb2w/OiBBSVRvb2w7XG59XG5cbi8vIFNpbXBsZSBwcm9tcHQgaGVscGVyIHVzaW5nIHJlYWRsaW5lXG5hc3luYyBmdW5jdGlvbiBwcm9tcHQocXVlc3Rpb246IHN0cmluZywgZGVmYXVsdFZhbHVlPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmVhZGxpbmUgPSBhd2FpdCBpbXBvcnQoJ3JlYWRsaW5lJyk7XG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBkaXNwbGF5UXVlc3Rpb24gPSBkZWZhdWx0VmFsdWUgXG4gICAgICA/IGAke3F1ZXN0aW9ufSAoJHtkZWZhdWx0VmFsdWV9KTogYFxuICAgICAgOiBgJHtxdWVzdGlvbn06IGA7XG4gICAgXG4gICAgcmwucXVlc3Rpb24oZGlzcGxheVF1ZXN0aW9uLCAoYW5zd2VyKSA9PiB7XG4gICAgICBybC5jbG9zZSgpO1xuICAgICAgcmVzb2x2ZShhbnN3ZXIudHJpbSgpIHx8IGRlZmF1bHRWYWx1ZSB8fCAnJyk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9tcHRTZWxlY3QocXVlc3Rpb246IHN0cmluZywgY2hvaWNlczogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnNvbGUubG9nKGBcXG4ke3F1ZXN0aW9ufVxcbmApO1xuICBjaG9pY2VzLmZvckVhY2goKGNob2ljZSwgaSkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGAgICR7aSArIDF9LiAke2Nob2ljZS5sYWJlbH1gKTtcbiAgfSk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIFxuICBjb25zdCByZWFkbGluZSA9IGF3YWl0IGltcG9ydCgncmVhZGxpbmUnKTtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHJsLnF1ZXN0aW9uKCdFbnRlciBudW1iZXI6ICcsIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKCk7XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGFuc3dlci50cmltKCksIDEwKSAtIDE7XG4gICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGNob2ljZXMubGVuZ3RoKSB7XG4gICAgICAgIHJlc29sdmUoY2hvaWNlc1tpbmRleF0udmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGVmYXVsdCB0byBmaXJzdCBjaG9pY2VcbiAgICAgICAgcmVzb2x2ZShjaG9pY2VzWzBdLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8vIENsYXVkZSBDb2RlIHNraWxscyB0byBjcmVhdGVcbmNvbnN0IENMQVVERV9TS0lMTFMgPSBbXG4gICdib290c3RyYXAtZG9jcycsXG4gICdtaWdyYXRlLWRvY3MnLFxuICAnaW1wb3J0LWFwaS1zcGVjJyxcbiAgJ3N5bmMtZG9jcycsXG4gICdjaGVjay1kb2NzJyxcbiAgJ2NyZWF0ZS1kb2MtcGFnZScsXG4gICd1cGRhdGUtZG9jcy1qc29uJyxcbiAgJ2dlbmVyYXRlLWFwaS1kb2NzJyxcbiAgJ2RvY3MtZnJvbS1jb2RlJyxcbl07XG5cbi8vIEN1cnNvciBydWxlcyB0byBjcmVhdGVcbmNvbnN0IENVUlNPUl9SVUxFUyA9IFtcbiAgJ2RldmRvYy5tZGMnLFxuICAnZGV2ZG9jLWJvb3RzdHJhcC5tZGMnLFxuICAnZGV2ZG9jLW1pZ3JhdGUubWRjJyxcbiAgJ2RldmRvYy1zeW5jLm1kYycsXG5dO1xuXG4vKipcbiAqIEdldCB0aGUgdGVtcGxhdGUgZGlyZWN0b3J5IHBhdGggKGhhbmRsZXMgYm90aCBkZXZlbG9wbWVudCBhbmQgaW5zdGFsbGVkIHBhY2thZ2Ugc2NlbmFyaW9zKVxuICovXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZURpcigpOiBzdHJpbmcge1xuICAvLyBUcnkgcmVsYXRpdmUgdG8gdGhpcyBmaWxlIChwYWNrYWdlcy9kZXZkb2Mvc3JjL2NsaS9jb21tYW5kcyAtPiBwYWNrYWdlcy9kZXZkb2MvdGVtcGxhdGVzKVxuICBsZXQgdGVtcGxhdGVEaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLi4nLCAndGVtcGxhdGVzJywgJ3N0YXJ0ZXInKTtcbiAgXG4gIGlmIChmcy5leGlzdHNTeW5jKHRlbXBsYXRlRGlyKSkge1xuICAgIHJldHVybiB0ZW1wbGF0ZURpcjtcbiAgfVxuICBcbiAgLy8gVHJ5IGRldmRvYy90ZW1wbGF0ZXMgYXQgcmVwbyByb290IChkZXZlbG9wbWVudCAtIG1vbm9yZXBvIHN0cnVjdHVyZSlcbiAgLy8gX19kaXJuYW1lIGlzIHBhY2thZ2VzL2RldmRvYy9zcmMvY2xpL2NvbW1hbmRzIC0+IGdvIHVwIDUgbGV2ZWxzIHRvIHJlcG8gcm9vdFxuICB0ZW1wbGF0ZURpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICcuLicsICcuLicsICdkZXZkb2MnLCAndGVtcGxhdGVzJywgJ3N0YXJ0ZXInKTtcbiAgXG4gIGlmIChmcy5leGlzdHNTeW5jKHRlbXBsYXRlRGlyKSkge1xuICAgIHJldHVybiB0ZW1wbGF0ZURpcjtcbiAgfVxuICBcbiAgLy8gVHJ5IG5vZGVfbW9kdWxlcyBsb2NhdGlvbiAoaW5zdGFsbGVkIHBhY2thZ2UpXG4gIHRlbXBsYXRlRGlyID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ3RlbXBsYXRlcycsICdzdGFydGVyJyk7XG4gIFxuICBpZiAoZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZURpcikpIHtcbiAgICByZXR1cm4gdGVtcGxhdGVEaXI7XG4gIH1cbiAgXG4gIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgdGVtcGxhdGUgZGlyZWN0b3J5Jyk7XG59XG5cbi8qKlxuICogQ29weSBDTEFVREUubWQgdG8gcHJvamVjdCByb290XG4gKi9cbmZ1bmN0aW9uIGNvcHlDbGF1ZGVNZChwcm9qZWN0UGF0aDogc3RyaW5nLCB0ZW1wbGF0ZURpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBwYXRoLmpvaW4odGVtcGxhdGVEaXIsICdDTEFVREUubWQnKTtcbiAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4ocHJvamVjdFBhdGgsICdDTEFVREUubWQnKTtcbiAgXG4gIGlmICghZnMuZXhpc3RzU3luYyhzb3VyY2VQYXRoKSkge1xuICAgIGxvZ2dlci53YXJuKCdDTEFVREUubWQgdGVtcGxhdGUgbm90IGZvdW5kJyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIFxuICBmcy5jb3B5U3luYyhzb3VyY2VQYXRoLCBkZXN0UGF0aCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENvcHkgQ2xhdWRlIENvZGUgc2tpbGxzIHRvIC5jbGF1ZGUvc2tpbGxzL1xuICovXG5mdW5jdGlvbiBjb3B5Q2xhdWRlU2tpbGxzKHByb2plY3RQYXRoOiBzdHJpbmcsIHRlbXBsYXRlRGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNvcGllZDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc291cmNlU2tpbGxzRGlyID0gcGF0aC5qb2luKHRlbXBsYXRlRGlyLCAnLmNsYXVkZScsICdza2lsbHMnKTtcbiAgY29uc3QgZGVzdFNraWxsc0RpciA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJy5jbGF1ZGUnLCAnc2tpbGxzJyk7XG4gIFxuICBpZiAoIWZzLmV4aXN0c1N5bmMoc291cmNlU2tpbGxzRGlyKSkge1xuICAgIGxvZ2dlci53YXJuKCdDbGF1ZGUgc2tpbGxzIHRlbXBsYXRlIGRpcmVjdG9yeSBub3QgZm91bmQnKTtcbiAgICByZXR1cm4gY29waWVkO1xuICB9XG4gIFxuICAvLyBFbnN1cmUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0c1xuICBmcy5lbnN1cmVEaXJTeW5jKGRlc3RTa2lsbHNEaXIpO1xuICBcbiAgZm9yIChjb25zdCBza2lsbCBvZiBDTEFVREVfU0tJTExTKSB7XG4gICAgY29uc3Qgc291cmNlRGlyID0gcGF0aC5qb2luKHNvdXJjZVNraWxsc0Rpciwgc2tpbGwpO1xuICAgIGNvbnN0IGRlc3REaXIgPSBwYXRoLmpvaW4oZGVzdFNraWxsc0Rpciwgc2tpbGwpO1xuICAgIFxuICAgIGlmIChmcy5leGlzdHNTeW5jKHNvdXJjZURpcikpIHtcbiAgICAgIGZzLmNvcHlTeW5jKHNvdXJjZURpciwgZGVzdERpcik7XG4gICAgICBjb3BpZWQucHVzaChza2lsbCk7XG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gY29waWVkO1xufVxuXG4vKipcbiAqIENvcHkgQ3Vyc29yIHJ1bGVzIHRvIC5jdXJzb3IvcnVsZXMvXG4gKi9cbmZ1bmN0aW9uIGNvcHlDdXJzb3JSdWxlcyhwcm9qZWN0UGF0aDogc3RyaW5nLCB0ZW1wbGF0ZURpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBjb3BpZWQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNvdXJjZVJ1bGVzRGlyID0gcGF0aC5qb2luKHRlbXBsYXRlRGlyLCAnLmN1cnNvcicsICdydWxlcycpO1xuICBjb25zdCBkZXN0UnVsZXNEaXIgPSBwYXRoLmpvaW4ocHJvamVjdFBhdGgsICcuY3Vyc29yJywgJ3J1bGVzJyk7XG4gIFxuICBpZiAoIWZzLmV4aXN0c1N5bmMoc291cmNlUnVsZXNEaXIpKSB7XG4gICAgbG9nZ2VyLndhcm4oJ0N1cnNvciBydWxlcyB0ZW1wbGF0ZSBkaXJlY3Rvcnkgbm90IGZvdW5kJyk7XG4gICAgcmV0dXJuIGNvcGllZDtcbiAgfVxuICBcbiAgLy8gRW5zdXJlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHNcbiAgZnMuZW5zdXJlRGlyU3luYyhkZXN0UnVsZXNEaXIpO1xuICBcbiAgZm9yIChjb25zdCBydWxlIG9mIENVUlNPUl9SVUxFUykge1xuICAgIGNvbnN0IHNvdXJjZVBhdGggPSBwYXRoLmpvaW4oc291cmNlUnVsZXNEaXIsIHJ1bGUpO1xuICAgIGNvbnN0IGRlc3RQYXRoID0gcGF0aC5qb2luKGRlc3RSdWxlc0RpciwgcnVsZSk7XG4gICAgXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoc291cmNlUGF0aCkpIHtcbiAgICAgIGZzLmNvcHlTeW5jKHNvdXJjZVBhdGgsIGRlc3RQYXRoKTtcbiAgICAgIGNvcGllZC5wdXNoKHJ1bGUpO1xuICAgIH1cbiAgfVxuICBcbiAgcmV0dXJuIGNvcGllZDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFpKG9wdGlvbnM6IEFJT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zb2xlLmxvZygpO1xuICBsb2dnZXIuaW5mbygnRGV2RG9jIEFJIEFnZW50IFNldHVwJyk7XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgY29uc3QgcHJvamVjdFBhdGggPSBwcm9jZXNzLmN3ZCgpO1xuICBcbiAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIERldkRvYyBwcm9qZWN0XG4gIGNvbnN0IGRvY3NKc29uUGF0aCA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJ2RvY3MuanNvbicpO1xuICBjb25zdCBoYXNEb2NzSnNvbiA9IGZzLmV4aXN0c1N5bmMoZG9jc0pzb25QYXRoKTtcbiAgXG4gIGlmICghaGFzRG9jc0pzb24pIHtcbiAgICBsb2dnZXIud2FybignTm8gZG9jcy5qc29uIGZvdW5kLiBUaGlzIG1heSBub3QgYmUgYSBEZXZEb2MgcHJvamVjdC4nKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG5cbiAgLy8gR2V0IHRlbXBsYXRlIGRpcmVjdG9yeVxuICBsZXQgdGVtcGxhdGVEaXI6IHN0cmluZztcbiAgdHJ5IHtcbiAgICB0ZW1wbGF0ZURpciA9IGdldFRlbXBsYXRlRGlyKCk7XG4gIH0gY2F0Y2gge1xuICAgIGxvZ2dlci5lcnJvcignQ291bGQgbm90IGZpbmQgQUkgYWdlbnQgdGVtcGxhdGVzLiBQbGVhc2UgZW5zdXJlIERldkRvYyBpcyBpbnN0YWxsZWQgY29ycmVjdGx5LicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIEdldCB0b29sIHNlbGVjdGlvbiBpZiBub3QgcHJvdmlkZWRcbiAgbGV0IHRvb2w6IEFJVG9vbCA9IG9wdGlvbnMudG9vbCB8fCAnYm90aCc7XG4gIFxuICBpZiAoIW9wdGlvbnMudG9vbCkge1xuICAgIGNvbnN0IHRvb2xDaG9pY2VzID0gW1xuICAgICAgeyB2YWx1ZTogJ2JvdGgnLCBsYWJlbDogJ0JvdGggLSBDbGF1ZGUgQ29kZSBhbmQgQ3Vyc29yJyB9LFxuICAgICAgeyB2YWx1ZTogJ2NsYXVkZScsIGxhYmVsOiAnQ2xhdWRlIENvZGUgLSBTa2lsbHMgYW5kIENMQVVERS5tZCcgfSxcbiAgICAgIHsgdmFsdWU6ICdjdXJzb3InLCBsYWJlbDogJ0N1cnNvciAtIFJ1bGVzICguY3Vyc29yL3J1bGVzLyknIH0sXG4gICAgXTtcblxuICAgIHRvb2wgPSBhd2FpdCBwcm9tcHRTZWxlY3QoJ1doaWNoIEFJIHRvb2wgZG8geW91IHVzZT8nLCB0b29sQ2hvaWNlcykgYXMgQUlUb29sO1xuICB9XG5cbiAgY29uc29sZS5sb2coKTtcbiAgbG9nZ2VyLmluZm8oJ1NldHRpbmcgdXAgQUkgYWdlbnQgY29uZmlndXJhdGlvbi4uLicpO1xuICBjb25zb2xlLmxvZygpO1xuXG4gIGNvbnN0IHJlc3VsdHMgPSB7XG4gICAgY2xhdWRlTWQ6IGZhbHNlLFxuICAgIGNsYXVkZVNraWxsczogW10gYXMgc3RyaW5nW10sXG4gICAgY3Vyc29yUnVsZXM6IFtdIGFzIHN0cmluZ1tdLFxuICB9O1xuXG4gIC8vIFNldHVwIENsYXVkZSBDb2RlXG4gIGlmICh0b29sID09PSAnY2xhdWRlJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICAvLyBDb3B5IENMQVVERS5tZFxuICAgIHJlc3VsdHMuY2xhdWRlTWQgPSBjb3B5Q2xhdWRlTWQocHJvamVjdFBhdGgsIHRlbXBsYXRlRGlyKTtcbiAgICBpZiAocmVzdWx0cy5jbGF1ZGVNZCkge1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoJ0NyZWF0ZWQgQ0xBVURFLm1kJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIENvcHkgc2tpbGxzXG4gICAgcmVzdWx0cy5jbGF1ZGVTa2lsbHMgPSBjb3B5Q2xhdWRlU2tpbGxzKHByb2plY3RQYXRoLCB0ZW1wbGF0ZURpcik7XG4gICAgZm9yIChjb25zdCBza2lsbCBvZiByZXN1bHRzLmNsYXVkZVNraWxscykge1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYENyZWF0ZWQgLmNsYXVkZS9za2lsbHMvJHtza2lsbH0vU0tJTEwubWRgKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXR1cCBDdXJzb3JcbiAgaWYgKHRvb2wgPT09ICdjdXJzb3InIHx8IHRvb2wgPT09ICdib3RoJykge1xuICAgIHJlc3VsdHMuY3Vyc29yUnVsZXMgPSBjb3B5Q3Vyc29yUnVsZXMocHJvamVjdFBhdGgsIHRlbXBsYXRlRGlyKTtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcmVzdWx0cy5jdXJzb3JSdWxlcykge1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYENyZWF0ZWQgLmN1cnNvci9ydWxlcy8ke3J1bGV9YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU3VtbWFyeVxuICBjb25zb2xlLmxvZygpO1xuICBsb2dnZXIuc3VjY2VzcygnQUkgYWdlbnQgY29uZmlndXJhdGlvbiBjb21wbGV0ZSEnKTtcbiAgY29uc29sZS5sb2coKTtcblxuICBpZiAodG9vbCA9PT0gJ2NsYXVkZScgfHwgdG9vbCA9PT0gJ2JvdGgnKSB7XG4gICAgY29uc29sZS5sb2coJ0F2YWlsYWJsZSBDbGF1ZGUgQ29kZSBjb21tYW5kczonKTtcbiAgICBjb25zb2xlLmxvZygnICAvYm9vdHN0cmFwLWRvY3MgICAgLSBBbmFseXplIHJlcG8gYW5kIGdlbmVyYXRlIGluaXRpYWwgZG9jdW1lbnRhdGlvbicpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9taWdyYXRlLWRvY3MgICAgICAtIE1pZ3JhdGUgZnJvbSBNaW50bGlmeSwgRG9jdXNhdXJ1cywgR2l0Qm9vaywgZXRjLicpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9pbXBvcnQtYXBpLXNwZWMgICAtIEltcG9ydCBPcGVuQVBJLCBHcmFwaFFMLCBvciBBc3luY0FQSSBzcGVjcycpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9zeW5jLWRvY3MgICAgICAgICAtIEZpbmQgYW5kIGZpeCBvdXRkYXRlZCBkb2N1bWVudGF0aW9uJyk7XG4gICAgY29uc29sZS5sb2coJyAgL2NoZWNrLWRvY3MgICAgICAgIC0gUXVpY2sgaGVhbHRoIGNoZWNrIHdpdGhvdXQgY2hhbmdlcycpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9jcmVhdGUtZG9jLXBhZ2UgICAtIENyZWF0ZSBhIG5ldyBkb2N1bWVudGF0aW9uIHBhZ2UnKTtcbiAgICBjb25zb2xlLmxvZygnICAvdXBkYXRlLWRvY3MtanNvbiAgLSBBZGQgcGFnZXMgdG8gbmF2aWdhdGlvbicpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9nZW5lcmF0ZS1hcGktZG9jcyAtIEdlbmVyYXRlIEFQSSBkb2N1bWVudGF0aW9uJyk7XG4gICAgY29uc29sZS5sb2coJyAgL2RvY3MtZnJvbS1jb2RlICAgIC0gR2VuZXJhdGUgZG9jcyBmcm9tIHNwZWNpZmljIGNvZGUgZmlsZXMnKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG5cbiAgaWYgKHRvb2wgPT09ICdjdXJzb3InIHx8IHRvb2wgPT09ICdib3RoJykge1xuICAgIGNvbnNvbGUubG9nKCdDdXJzb3IgcnVsZXMgY29uZmlndXJlZCBmb3IgKi5tZHggZmlsZXMuJyk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xlLmxvZygnU3VnZ2VzdGVkIHByb21wdHMgaW4gQWdlbnQgbW9kZTonKTtcbiAgICBjb25zb2xlLmxvZygnICBcIkFuYWx5emUgdGhpcyByZXBvIGFuZCBnZW5lcmF0ZSBpbml0aWFsIGRvY3VtZW50YXRpb25cIicpO1xuICAgIGNvbnNvbGUubG9nKCcgIFwiTWlncmF0ZSBteSBNaW50bGlmeSBkb2NzIHRvIERldkRvYyBmb3JtYXRcIicpO1xuICAgIGNvbnNvbGUubG9nKCcgIFwiQ2hlY2sgbXkgZG9jcyBmb3Igb3V0ZGF0ZWQgY29udGVudFwiJyk7XG4gICAgY29uc29sZS5sb2coJyAgXCJDcmVhdGUgYSBuZXcgZ3VpZGUgYWJvdXQgYXV0aGVudGljYXRpb25cIicpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gIH1cblxuICBjb25zb2xlLmxvZygnUXVpY2sgc3RhcnQ6Jyk7XG4gIGlmICh0b29sID09PSAnY2xhdWRlJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICBjb25zb2xlLmxvZygnICBDbGF1ZGUgQ29kZTogL2Jvb3RzdHJhcC1kb2NzJyk7XG4gIH1cbiAgaWYgKHRvb2wgPT09ICdjdXJzb3InIHx8IHRvb2wgPT09ICdib3RoJykge1xuICAgIGNvbnNvbGUubG9nKCcgIEN1cnNvcjogQXNrIFwiZ2VuZXJhdGUgaW5pdGlhbCBkb2N1bWVudGF0aW9uIGZyb20gdGhpcyByZXBvXCInKTtcbiAgfVxuICBjb25zb2xlLmxvZygpO1xufVxuIl19
@@ -2,14 +2,17 @@ declare const TEMPLATES: {
2
2
  readonly basic: {
3
3
  readonly name: "Basic";
4
4
  readonly description: "Simple documentation site with guides and pages";
5
+ readonly color: "#10b981";
5
6
  };
6
7
  readonly openapi: {
7
8
  readonly name: "OpenAPI";
8
9
  readonly description: "Documentation with REST API reference (OpenAPI/Swagger)";
10
+ readonly color: "#10b981";
9
11
  };
10
12
  readonly graphql: {
11
13
  readonly name: "GraphQL";
12
14
  readonly description: "Documentation with GraphQL API playground";
15
+ readonly color: "#e535ab";
13
16
  };
14
17
  };
15
18
  type TemplateType = keyof typeof TEMPLATES;