@djangocfg/nextjs 2.1.5 → 2.1.7
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/dist/ai/cli.d.mts +1 -0
- package/dist/ai/cli.mjs +171 -0
- package/dist/ai/cli.mjs.map +1 -0
- package/dist/ai/index.d.mts +81 -0
- package/dist/ai/index.mjs +139 -0
- package/dist/ai/index.mjs.map +1 -0
- package/dist/config/index.d.mts +360 -0
- package/dist/config/index.mjs +1363 -0
- package/dist/config/index.mjs.map +1 -0
- package/dist/constants-HezbftFb.d.mts +10 -0
- package/dist/contact/index.d.mts +47 -0
- package/dist/contact/index.mjs +98 -0
- package/dist/contact/index.mjs.map +1 -0
- package/dist/contact/route.d.mts +35 -0
- package/dist/contact/route.mjs +99 -0
- package/dist/contact/route.mjs.map +1 -0
- package/dist/health/index.d.mts +43 -0
- package/dist/health/index.mjs +38 -0
- package/dist/health/index.mjs.map +1 -0
- package/dist/index.d.mts +19 -0
- package/dist/index.mjs +2565 -0
- package/dist/index.mjs.map +1 -0
- package/dist/navigation/index.d.mts +89 -0
- package/dist/navigation/index.mjs +63 -0
- package/dist/navigation/index.mjs.map +1 -0
- package/dist/og-image/components/index.d.mts +59 -0
- package/dist/og-image/components/index.mjs +325 -0
- package/dist/og-image/components/index.mjs.map +1 -0
- package/dist/og-image/index.d.mts +112 -0
- package/dist/og-image/index.mjs +823 -0
- package/dist/og-image/index.mjs.map +1 -0
- package/dist/og-image/utils/index.d.mts +302 -0
- package/dist/og-image/utils/index.mjs +317 -0
- package/dist/og-image/utils/index.mjs.map +1 -0
- package/dist/sitemap/index.d.mts +66 -0
- package/dist/sitemap/index.mjs +76 -0
- package/dist/sitemap/index.mjs.map +1 -0
- package/dist/types-CwhXnEbK.d.mts +30 -0
- package/package.json +7 -6
- package/src/config/createNextConfig.ts +31 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
package/dist/ai/cli.mjs
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/ai/constants.ts
|
|
4
|
+
var MCP_BASE_URL = "https://mcp.djangocfg.com";
|
|
5
|
+
var MCP_SERVER_URL = `${MCP_BASE_URL}/mcp`;
|
|
6
|
+
var MCP_API_URL = `${MCP_BASE_URL}/api/search`;
|
|
7
|
+
var API_SEARCH_ENDPOINT = "/api/search";
|
|
8
|
+
var API_INFO_ENDPOINT = "/api/info";
|
|
9
|
+
var DEFAULT_TIMEOUT = 1e4;
|
|
10
|
+
var AI_DOCS_HINT = `\u{1F916} AI Docs: ${MCP_SERVER_URL} | pnpm ai-docs search "query"`;
|
|
11
|
+
var AI_HINT = `
|
|
12
|
+
DjangoCFG Documentation is available via MCP server.
|
|
13
|
+
|
|
14
|
+
To get help with DjangoCFG configuration:
|
|
15
|
+
1. Use the MCP server: ${MCP_SERVER_URL}
|
|
16
|
+
2. Or search directly: ${MCP_API_URL}?q=YOUR_QUERY&limit=5
|
|
17
|
+
|
|
18
|
+
Example queries:
|
|
19
|
+
- "How to configure PostgreSQL database?"
|
|
20
|
+
- "What is DatabaseConfig?"
|
|
21
|
+
- "How to setup Redis cache?"
|
|
22
|
+
- "Email configuration with SMTP"
|
|
23
|
+
`;
|
|
24
|
+
|
|
25
|
+
// src/ai/client.ts
|
|
26
|
+
var DjangoCfgDocsClient = class {
|
|
27
|
+
constructor(baseUrl = MCP_BASE_URL, timeout = DEFAULT_TIMEOUT) {
|
|
28
|
+
this.baseUrl = baseUrl.replace(/\/$/, "");
|
|
29
|
+
this.timeout = timeout;
|
|
30
|
+
}
|
|
31
|
+
async makeRequest(endpoint, params) {
|
|
32
|
+
let url = `${this.baseUrl}${endpoint}`;
|
|
33
|
+
if (params) {
|
|
34
|
+
const searchParams = new URLSearchParams();
|
|
35
|
+
for (const [key, value] of Object.entries(params)) {
|
|
36
|
+
searchParams.set(key, String(value));
|
|
37
|
+
}
|
|
38
|
+
url = `${url}?${searchParams.toString()}`;
|
|
39
|
+
}
|
|
40
|
+
const controller = new AbortController();
|
|
41
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
42
|
+
try {
|
|
43
|
+
const response = await fetch(url, {
|
|
44
|
+
method: "GET",
|
|
45
|
+
headers: {
|
|
46
|
+
Accept: "application/json",
|
|
47
|
+
"User-Agent": "DjangoCFG-AI-Client/1.0"
|
|
48
|
+
},
|
|
49
|
+
signal: controller.signal
|
|
50
|
+
});
|
|
51
|
+
if (!response.ok) {
|
|
52
|
+
throw new Error(`HTTP Error ${response.status}: ${response.statusText}`);
|
|
53
|
+
}
|
|
54
|
+
return await response.json();
|
|
55
|
+
} finally {
|
|
56
|
+
clearTimeout(timeoutId);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Search documentation.
|
|
61
|
+
*/
|
|
62
|
+
async search(query2, options = {}) {
|
|
63
|
+
const { limit = 5, category } = options;
|
|
64
|
+
const params = { q: query2, limit };
|
|
65
|
+
if (category) {
|
|
66
|
+
params.category = category;
|
|
67
|
+
}
|
|
68
|
+
const data = await this.makeRequest(API_SEARCH_ENDPOINT, params);
|
|
69
|
+
const results = data.results || (Array.isArray(data) ? data : []);
|
|
70
|
+
return results.map((item) => ({
|
|
71
|
+
title: item.title || "",
|
|
72
|
+
content: item.content || item.snippet || "",
|
|
73
|
+
url: item.url || "",
|
|
74
|
+
score: item.score || 0,
|
|
75
|
+
category: item.category || ""
|
|
76
|
+
}));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get detailed info about a specific topic.
|
|
80
|
+
*/
|
|
81
|
+
async getInfo(topic) {
|
|
82
|
+
return this.makeRequest(API_INFO_ENDPOINT, { topic });
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get MCP server configuration for AI assistants.
|
|
86
|
+
*/
|
|
87
|
+
getMcpConfig() {
|
|
88
|
+
return {
|
|
89
|
+
mcpServers: {
|
|
90
|
+
"djangocfg-docs": {
|
|
91
|
+
url: `${this.baseUrl}/mcp`
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
var defaultClient = null;
|
|
98
|
+
function getClient() {
|
|
99
|
+
if (!defaultClient) {
|
|
100
|
+
defaultClient = new DjangoCfgDocsClient();
|
|
101
|
+
}
|
|
102
|
+
return defaultClient;
|
|
103
|
+
}
|
|
104
|
+
async function search(query2, options = {}) {
|
|
105
|
+
return getClient().search(query2, options);
|
|
106
|
+
}
|
|
107
|
+
function getMcpConfig() {
|
|
108
|
+
return getClient().getMcpConfig();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// src/ai/cli.ts
|
|
112
|
+
var args = process.argv.slice(2);
|
|
113
|
+
var command = args[0];
|
|
114
|
+
var query = args.slice(1).join(" ");
|
|
115
|
+
async function main() {
|
|
116
|
+
switch (command) {
|
|
117
|
+
case "search":
|
|
118
|
+
case "s":
|
|
119
|
+
if (!query) {
|
|
120
|
+
console.error('Usage: ai-docs search "your query"');
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
console.log(`
|
|
124
|
+
\u{1F50D} Searching: ${query}
|
|
125
|
+
`);
|
|
126
|
+
try {
|
|
127
|
+
const results = await search(query, { limit: 5 });
|
|
128
|
+
if (results.length === 0) {
|
|
129
|
+
console.log("No results found.");
|
|
130
|
+
} else {
|
|
131
|
+
results.forEach((r, i) => {
|
|
132
|
+
console.log(`${i + 1}. ${r.title}`);
|
|
133
|
+
console.log(` ${r.content.slice(0, 150)}...`);
|
|
134
|
+
if (r.url) console.log(` \u{1F4D6} ${r.url}`);
|
|
135
|
+
console.log("");
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
} catch (err) {
|
|
139
|
+
console.error("Error:", err instanceof Error ? err.message : err);
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
break;
|
|
143
|
+
case "mcp":
|
|
144
|
+
console.log("\n\u{1F4E1} MCP Server Configuration:\n");
|
|
145
|
+
console.log(JSON.stringify(getMcpConfig(), null, 2));
|
|
146
|
+
console.log("\nAdd this to your AI assistant configuration.");
|
|
147
|
+
break;
|
|
148
|
+
case "info":
|
|
149
|
+
case "i":
|
|
150
|
+
console.log("\n\u{1F916} DjangoCFG AI Documentation\n");
|
|
151
|
+
console.log(`MCP Server: ${MCP_SERVER_URL}`);
|
|
152
|
+
console.log(`Search API: ${MCP_API_URL}`);
|
|
153
|
+
console.log("\nUsage:");
|
|
154
|
+
console.log(' pnpm exec ai-docs search "database configuration"');
|
|
155
|
+
console.log(" pnpm exec ai-docs mcp");
|
|
156
|
+
break;
|
|
157
|
+
default:
|
|
158
|
+
console.log("\u{1F916} DjangoCFG AI Documentation CLI\n");
|
|
159
|
+
console.log("Commands:");
|
|
160
|
+
console.log(" search <query> Search documentation");
|
|
161
|
+
console.log(" mcp Show MCP server config");
|
|
162
|
+
console.log(" info Show help\n");
|
|
163
|
+
console.log("Examples:");
|
|
164
|
+
console.log(' pnpm exec ai-docs search "database configuration"');
|
|
165
|
+
console.log(' pnpm exec ai-docs search "redis cache"');
|
|
166
|
+
console.log(" pnpm exec ai-docs mcp");
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
main();
|
|
171
|
+
//# sourceMappingURL=cli.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/ai/constants.ts","../../src/ai/client.ts","../../src/ai/cli.ts"],"sourcesContent":["/**\n * AI Documentation Constants\n */\n\n// MCP Server URLs\nexport const MCP_BASE_URL = 'https://mcp.djangocfg.com';\nexport const MCP_SERVER_URL = `${MCP_BASE_URL}/mcp`;\nexport const MCP_API_URL = `${MCP_BASE_URL}/api/search`;\n\n// API Endpoints\nexport const API_SEARCH_ENDPOINT = '/api/search';\nexport const API_INFO_ENDPOINT = '/api/info';\nexport const DEFAULT_TIMEOUT = 10000; // ms\n\n// AI Hint for console output\nexport const AI_DOCS_HINT = `🤖 AI Docs: ${MCP_SERVER_URL} | pnpm ai-docs search \"query\"`;\n\n// Full AI Hint description\nexport const AI_HINT = `\nDjangoCFG Documentation is available via MCP server.\n\nTo get help with DjangoCFG configuration:\n1. Use the MCP server: ${MCP_SERVER_URL}\n2. Or search directly: ${MCP_API_URL}?q=YOUR_QUERY&limit=5\n\nExample queries:\n- \"How to configure PostgreSQL database?\"\n- \"What is DatabaseConfig?\"\n- \"How to setup Redis cache?\"\n- \"Email configuration with SMTP\"\n`;\n","/**\n * DjangoCFG Documentation Client\n *\n * HTTP client for accessing DjangoCFG documentation via MCP server API.\n */\n\nimport {\n MCP_BASE_URL,\n API_SEARCH_ENDPOINT,\n API_INFO_ENDPOINT,\n DEFAULT_TIMEOUT,\n} from './constants';\nimport type { SearchResult, SearchOptions, McpConfig, ApiSearchResponse } from './types';\n\n/**\n * Client for DjangoCFG Documentation API.\n */\nexport class DjangoCfgDocsClient {\n private baseUrl: string;\n private timeout: number;\n\n constructor(baseUrl: string = MCP_BASE_URL, timeout: number = DEFAULT_TIMEOUT) {\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n this.timeout = timeout;\n }\n\n private async makeRequest<T>(endpoint: string, params?: Record<string, string | number>): Promise<T> {\n let url = `${this.baseUrl}${endpoint}`;\n\n if (params) {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n searchParams.set(key, String(value));\n }\n url = `${url}?${searchParams.toString()}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n 'User-Agent': 'DjangoCFG-AI-Client/1.0',\n },\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP Error ${response.status}: ${response.statusText}`);\n }\n\n return await response.json();\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Search documentation.\n */\n async search(query: string, options: SearchOptions = {}): Promise<SearchResult[]> {\n const { limit = 5, category } = options;\n\n const params: Record<string, string | number> = { q: query, limit };\n if (category) {\n params.category = category;\n }\n\n const data = await this.makeRequest<ApiSearchResponse>(API_SEARCH_ENDPOINT, params);\n\n const results = data.results || (Array.isArray(data) ? data : []);\n\n return results.map((item) => ({\n title: item.title || '',\n content: item.content || item.snippet || '',\n url: item.url || '',\n score: item.score || 0,\n category: item.category || '',\n }));\n }\n\n /**\n * Get detailed info about a specific topic.\n */\n async getInfo(topic: string): Promise<Record<string, unknown>> {\n return this.makeRequest(API_INFO_ENDPOINT, { topic });\n }\n\n /**\n * Get MCP server configuration for AI assistants.\n */\n getMcpConfig(): McpConfig {\n return {\n mcpServers: {\n 'djangocfg-docs': {\n url: `${this.baseUrl}/mcp`,\n },\n },\n };\n }\n}\n\n// Default client instance\nlet defaultClient: DjangoCfgDocsClient | null = null;\n\nfunction getClient(): DjangoCfgDocsClient {\n if (!defaultClient) {\n defaultClient = new DjangoCfgDocsClient();\n }\n return defaultClient;\n}\n\n/**\n * Search DjangoCFG documentation.\n *\n * @example\n * ```ts\n * const results = await search('database configuration');\n * results.forEach(r => console.log(r.title, r.url));\n * ```\n */\nexport async function search(query: string, options: SearchOptions = {}): Promise<SearchResult[]> {\n return getClient().search(query, options);\n}\n\n/**\n * Get documentation as formatted text.\n *\n * @example\n * ```ts\n * const docs = await getDocs('How to configure PostgreSQL?');\n * console.log(docs);\n * ```\n */\nexport async function getDocs(query: string, limit: number = 3): Promise<string> {\n const results = await search(query, { limit });\n\n if (results.length === 0) {\n return `No documentation found for: ${query}`;\n }\n\n const output: string[] = [];\n\n results.forEach((r, i) => {\n output.push(`## ${i + 1}. ${r.title}`);\n output.push(r.content);\n if (r.url) {\n output.push(`📖 Read more: ${r.url}`);\n }\n output.push('');\n });\n\n return output.join('\\n');\n}\n\n/**\n * Get detailed info about a topic.\n */\nexport async function getInfo(topic: string): Promise<Record<string, unknown>> {\n return getClient().getInfo(topic);\n}\n\n/**\n * Get MCP server configuration.\n */\nexport function getMcpConfig(): McpConfig {\n return getClient().getMcpConfig();\n}\n","#!/usr/bin/env node\n/**\n * DjangoCFG AI Docs CLI\n *\n * Usage:\n * pnpm exec ai-docs search \"database configuration\"\n * pnpm exec ai-docs mcp\n * npx @djangocfg/nextjs ai-docs search \"query\"\n */\n\nimport { search, getMcpConfig, MCP_SERVER_URL, MCP_API_URL } from './index';\n\nconst args = process.argv.slice(2);\nconst command = args[0];\nconst query = args.slice(1).join(' ');\n\nasync function main() {\n switch (command) {\n case 'search':\n case 's':\n if (!query) {\n console.error('Usage: ai-docs search \"your query\"');\n process.exit(1);\n }\n console.log(`\\n🔍 Searching: ${query}\\n`);\n try {\n const results = await search(query, { limit: 5 });\n if (results.length === 0) {\n console.log('No results found.');\n } else {\n results.forEach((r, i) => {\n console.log(`${i + 1}. ${r.title}`);\n console.log(` ${r.content.slice(0, 150)}...`);\n if (r.url) console.log(` 📖 ${r.url}`);\n console.log('');\n });\n }\n } catch (err) {\n console.error('Error:', err instanceof Error ? err.message : err);\n process.exit(1);\n }\n break;\n\n case 'mcp':\n console.log('\\n📡 MCP Server Configuration:\\n');\n console.log(JSON.stringify(getMcpConfig(), null, 2));\n console.log('\\nAdd this to your AI assistant configuration.');\n break;\n\n case 'info':\n case 'i':\n console.log('\\n🤖 DjangoCFG AI Documentation\\n');\n console.log(`MCP Server: ${MCP_SERVER_URL}`);\n console.log(`Search API: ${MCP_API_URL}`);\n console.log('\\nUsage:');\n console.log(' pnpm exec ai-docs search \"database configuration\"');\n console.log(' pnpm exec ai-docs mcp');\n break;\n\n default:\n console.log('🤖 DjangoCFG AI Documentation CLI\\n');\n console.log('Commands:');\n console.log(' search <query> Search documentation');\n console.log(' mcp Show MCP server config');\n console.log(' info Show help\\n');\n console.log('Examples:');\n console.log(' pnpm exec ai-docs search \"database configuration\"');\n console.log(' pnpm exec ai-docs search \"redis cache\"');\n console.log(' pnpm exec ai-docs mcp');\n break;\n }\n}\n\nmain();\n"],"mappings":"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","names":["query"]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export { A as AI_DOCS_HINT, c as AI_HINT, b as MCP_API_URL, M as MCP_BASE_URL, a as MCP_SERVER_URL } from '../constants-HezbftFb.mjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* AI Documentation Types
|
|
5
|
+
*/
|
|
6
|
+
interface SearchResult {
|
|
7
|
+
title: string;
|
|
8
|
+
content: string;
|
|
9
|
+
url: string;
|
|
10
|
+
score: number;
|
|
11
|
+
category: string;
|
|
12
|
+
}
|
|
13
|
+
interface SearchOptions {
|
|
14
|
+
limit?: number;
|
|
15
|
+
category?: string;
|
|
16
|
+
}
|
|
17
|
+
interface McpConfig {
|
|
18
|
+
mcpServers: {
|
|
19
|
+
'djangocfg-docs': {
|
|
20
|
+
url: string;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* DjangoCFG Documentation Client
|
|
27
|
+
*
|
|
28
|
+
* HTTP client for accessing DjangoCFG documentation via MCP server API.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Client for DjangoCFG Documentation API.
|
|
33
|
+
*/
|
|
34
|
+
declare class DjangoCfgDocsClient {
|
|
35
|
+
private baseUrl;
|
|
36
|
+
private timeout;
|
|
37
|
+
constructor(baseUrl?: string, timeout?: number);
|
|
38
|
+
private makeRequest;
|
|
39
|
+
/**
|
|
40
|
+
* Search documentation.
|
|
41
|
+
*/
|
|
42
|
+
search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
|
|
43
|
+
/**
|
|
44
|
+
* Get detailed info about a specific topic.
|
|
45
|
+
*/
|
|
46
|
+
getInfo(topic: string): Promise<Record<string, unknown>>;
|
|
47
|
+
/**
|
|
48
|
+
* Get MCP server configuration for AI assistants.
|
|
49
|
+
*/
|
|
50
|
+
getMcpConfig(): McpConfig;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Search DjangoCFG documentation.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* const results = await search('database configuration');
|
|
58
|
+
* results.forEach(r => console.log(r.title, r.url));
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
declare function search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
|
|
62
|
+
/**
|
|
63
|
+
* Get documentation as formatted text.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```ts
|
|
67
|
+
* const docs = await getDocs('How to configure PostgreSQL?');
|
|
68
|
+
* console.log(docs);
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
declare function getDocs(query: string, limit?: number): Promise<string>;
|
|
72
|
+
/**
|
|
73
|
+
* Get detailed info about a topic.
|
|
74
|
+
*/
|
|
75
|
+
declare function getInfo(topic: string): Promise<Record<string, unknown>>;
|
|
76
|
+
/**
|
|
77
|
+
* Get MCP server configuration.
|
|
78
|
+
*/
|
|
79
|
+
declare function getMcpConfig(): McpConfig;
|
|
80
|
+
|
|
81
|
+
export { DjangoCfgDocsClient, type McpConfig, type SearchOptions, type SearchResult, getDocs, getInfo, getMcpConfig, search };
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// src/ai/constants.ts
|
|
2
|
+
var MCP_BASE_URL = "https://mcp.djangocfg.com";
|
|
3
|
+
var MCP_SERVER_URL = `${MCP_BASE_URL}/mcp`;
|
|
4
|
+
var MCP_API_URL = `${MCP_BASE_URL}/api/search`;
|
|
5
|
+
var API_SEARCH_ENDPOINT = "/api/search";
|
|
6
|
+
var API_INFO_ENDPOINT = "/api/info";
|
|
7
|
+
var DEFAULT_TIMEOUT = 1e4;
|
|
8
|
+
var AI_DOCS_HINT = `\u{1F916} AI Docs: ${MCP_SERVER_URL} | pnpm ai-docs search "query"`;
|
|
9
|
+
var AI_HINT = `
|
|
10
|
+
DjangoCFG Documentation is available via MCP server.
|
|
11
|
+
|
|
12
|
+
To get help with DjangoCFG configuration:
|
|
13
|
+
1. Use the MCP server: ${MCP_SERVER_URL}
|
|
14
|
+
2. Or search directly: ${MCP_API_URL}?q=YOUR_QUERY&limit=5
|
|
15
|
+
|
|
16
|
+
Example queries:
|
|
17
|
+
- "How to configure PostgreSQL database?"
|
|
18
|
+
- "What is DatabaseConfig?"
|
|
19
|
+
- "How to setup Redis cache?"
|
|
20
|
+
- "Email configuration with SMTP"
|
|
21
|
+
`;
|
|
22
|
+
|
|
23
|
+
// src/ai/client.ts
|
|
24
|
+
var DjangoCfgDocsClient = class {
|
|
25
|
+
constructor(baseUrl = MCP_BASE_URL, timeout = DEFAULT_TIMEOUT) {
|
|
26
|
+
this.baseUrl = baseUrl.replace(/\/$/, "");
|
|
27
|
+
this.timeout = timeout;
|
|
28
|
+
}
|
|
29
|
+
async makeRequest(endpoint, params) {
|
|
30
|
+
let url = `${this.baseUrl}${endpoint}`;
|
|
31
|
+
if (params) {
|
|
32
|
+
const searchParams = new URLSearchParams();
|
|
33
|
+
for (const [key, value] of Object.entries(params)) {
|
|
34
|
+
searchParams.set(key, String(value));
|
|
35
|
+
}
|
|
36
|
+
url = `${url}?${searchParams.toString()}`;
|
|
37
|
+
}
|
|
38
|
+
const controller = new AbortController();
|
|
39
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
40
|
+
try {
|
|
41
|
+
const response = await fetch(url, {
|
|
42
|
+
method: "GET",
|
|
43
|
+
headers: {
|
|
44
|
+
Accept: "application/json",
|
|
45
|
+
"User-Agent": "DjangoCFG-AI-Client/1.0"
|
|
46
|
+
},
|
|
47
|
+
signal: controller.signal
|
|
48
|
+
});
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
throw new Error(`HTTP Error ${response.status}: ${response.statusText}`);
|
|
51
|
+
}
|
|
52
|
+
return await response.json();
|
|
53
|
+
} finally {
|
|
54
|
+
clearTimeout(timeoutId);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Search documentation.
|
|
59
|
+
*/
|
|
60
|
+
async search(query, options = {}) {
|
|
61
|
+
const { limit = 5, category } = options;
|
|
62
|
+
const params = { q: query, limit };
|
|
63
|
+
if (category) {
|
|
64
|
+
params.category = category;
|
|
65
|
+
}
|
|
66
|
+
const data = await this.makeRequest(API_SEARCH_ENDPOINT, params);
|
|
67
|
+
const results = data.results || (Array.isArray(data) ? data : []);
|
|
68
|
+
return results.map((item) => ({
|
|
69
|
+
title: item.title || "",
|
|
70
|
+
content: item.content || item.snippet || "",
|
|
71
|
+
url: item.url || "",
|
|
72
|
+
score: item.score || 0,
|
|
73
|
+
category: item.category || ""
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get detailed info about a specific topic.
|
|
78
|
+
*/
|
|
79
|
+
async getInfo(topic) {
|
|
80
|
+
return this.makeRequest(API_INFO_ENDPOINT, { topic });
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get MCP server configuration for AI assistants.
|
|
84
|
+
*/
|
|
85
|
+
getMcpConfig() {
|
|
86
|
+
return {
|
|
87
|
+
mcpServers: {
|
|
88
|
+
"djangocfg-docs": {
|
|
89
|
+
url: `${this.baseUrl}/mcp`
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
var defaultClient = null;
|
|
96
|
+
function getClient() {
|
|
97
|
+
if (!defaultClient) {
|
|
98
|
+
defaultClient = new DjangoCfgDocsClient();
|
|
99
|
+
}
|
|
100
|
+
return defaultClient;
|
|
101
|
+
}
|
|
102
|
+
async function search(query, options = {}) {
|
|
103
|
+
return getClient().search(query, options);
|
|
104
|
+
}
|
|
105
|
+
async function getDocs(query, limit = 3) {
|
|
106
|
+
const results = await search(query, { limit });
|
|
107
|
+
if (results.length === 0) {
|
|
108
|
+
return `No documentation found for: ${query}`;
|
|
109
|
+
}
|
|
110
|
+
const output = [];
|
|
111
|
+
results.forEach((r, i) => {
|
|
112
|
+
output.push(`## ${i + 1}. ${r.title}`);
|
|
113
|
+
output.push(r.content);
|
|
114
|
+
if (r.url) {
|
|
115
|
+
output.push(`\u{1F4D6} Read more: ${r.url}`);
|
|
116
|
+
}
|
|
117
|
+
output.push("");
|
|
118
|
+
});
|
|
119
|
+
return output.join("\n");
|
|
120
|
+
}
|
|
121
|
+
async function getInfo(topic) {
|
|
122
|
+
return getClient().getInfo(topic);
|
|
123
|
+
}
|
|
124
|
+
function getMcpConfig() {
|
|
125
|
+
return getClient().getMcpConfig();
|
|
126
|
+
}
|
|
127
|
+
export {
|
|
128
|
+
AI_DOCS_HINT,
|
|
129
|
+
AI_HINT,
|
|
130
|
+
DjangoCfgDocsClient,
|
|
131
|
+
MCP_API_URL,
|
|
132
|
+
MCP_BASE_URL,
|
|
133
|
+
MCP_SERVER_URL,
|
|
134
|
+
getDocs,
|
|
135
|
+
getInfo,
|
|
136
|
+
getMcpConfig,
|
|
137
|
+
search
|
|
138
|
+
};
|
|
139
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/ai/constants.ts","../../src/ai/client.ts"],"sourcesContent":["/**\n * AI Documentation Constants\n */\n\n// MCP Server URLs\nexport const MCP_BASE_URL = 'https://mcp.djangocfg.com';\nexport const MCP_SERVER_URL = `${MCP_BASE_URL}/mcp`;\nexport const MCP_API_URL = `${MCP_BASE_URL}/api/search`;\n\n// API Endpoints\nexport const API_SEARCH_ENDPOINT = '/api/search';\nexport const API_INFO_ENDPOINT = '/api/info';\nexport const DEFAULT_TIMEOUT = 10000; // ms\n\n// AI Hint for console output\nexport const AI_DOCS_HINT = `🤖 AI Docs: ${MCP_SERVER_URL} | pnpm ai-docs search \"query\"`;\n\n// Full AI Hint description\nexport const AI_HINT = `\nDjangoCFG Documentation is available via MCP server.\n\nTo get help with DjangoCFG configuration:\n1. Use the MCP server: ${MCP_SERVER_URL}\n2. Or search directly: ${MCP_API_URL}?q=YOUR_QUERY&limit=5\n\nExample queries:\n- \"How to configure PostgreSQL database?\"\n- \"What is DatabaseConfig?\"\n- \"How to setup Redis cache?\"\n- \"Email configuration with SMTP\"\n`;\n","/**\n * DjangoCFG Documentation Client\n *\n * HTTP client for accessing DjangoCFG documentation via MCP server API.\n */\n\nimport {\n MCP_BASE_URL,\n API_SEARCH_ENDPOINT,\n API_INFO_ENDPOINT,\n DEFAULT_TIMEOUT,\n} from './constants';\nimport type { SearchResult, SearchOptions, McpConfig, ApiSearchResponse } from './types';\n\n/**\n * Client for DjangoCFG Documentation API.\n */\nexport class DjangoCfgDocsClient {\n private baseUrl: string;\n private timeout: number;\n\n constructor(baseUrl: string = MCP_BASE_URL, timeout: number = DEFAULT_TIMEOUT) {\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n this.timeout = timeout;\n }\n\n private async makeRequest<T>(endpoint: string, params?: Record<string, string | number>): Promise<T> {\n let url = `${this.baseUrl}${endpoint}`;\n\n if (params) {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n searchParams.set(key, String(value));\n }\n url = `${url}?${searchParams.toString()}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n 'User-Agent': 'DjangoCFG-AI-Client/1.0',\n },\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP Error ${response.status}: ${response.statusText}`);\n }\n\n return await response.json();\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Search documentation.\n */\n async search(query: string, options: SearchOptions = {}): Promise<SearchResult[]> {\n const { limit = 5, category } = options;\n\n const params: Record<string, string | number> = { q: query, limit };\n if (category) {\n params.category = category;\n }\n\n const data = await this.makeRequest<ApiSearchResponse>(API_SEARCH_ENDPOINT, params);\n\n const results = data.results || (Array.isArray(data) ? data : []);\n\n return results.map((item) => ({\n title: item.title || '',\n content: item.content || item.snippet || '',\n url: item.url || '',\n score: item.score || 0,\n category: item.category || '',\n }));\n }\n\n /**\n * Get detailed info about a specific topic.\n */\n async getInfo(topic: string): Promise<Record<string, unknown>> {\n return this.makeRequest(API_INFO_ENDPOINT, { topic });\n }\n\n /**\n * Get MCP server configuration for AI assistants.\n */\n getMcpConfig(): McpConfig {\n return {\n mcpServers: {\n 'djangocfg-docs': {\n url: `${this.baseUrl}/mcp`,\n },\n },\n };\n }\n}\n\n// Default client instance\nlet defaultClient: DjangoCfgDocsClient | null = null;\n\nfunction getClient(): DjangoCfgDocsClient {\n if (!defaultClient) {\n defaultClient = new DjangoCfgDocsClient();\n }\n return defaultClient;\n}\n\n/**\n * Search DjangoCFG documentation.\n *\n * @example\n * ```ts\n * const results = await search('database configuration');\n * results.forEach(r => console.log(r.title, r.url));\n * ```\n */\nexport async function search(query: string, options: SearchOptions = {}): Promise<SearchResult[]> {\n return getClient().search(query, options);\n}\n\n/**\n * Get documentation as formatted text.\n *\n * @example\n * ```ts\n * const docs = await getDocs('How to configure PostgreSQL?');\n * console.log(docs);\n * ```\n */\nexport async function getDocs(query: string, limit: number = 3): Promise<string> {\n const results = await search(query, { limit });\n\n if (results.length === 0) {\n return `No documentation found for: ${query}`;\n }\n\n const output: string[] = [];\n\n results.forEach((r, i) => {\n output.push(`## ${i + 1}. ${r.title}`);\n output.push(r.content);\n if (r.url) {\n output.push(`📖 Read more: ${r.url}`);\n }\n output.push('');\n });\n\n return output.join('\\n');\n}\n\n/**\n * Get detailed info about a topic.\n */\nexport async function getInfo(topic: string): Promise<Record<string, unknown>> {\n return getClient().getInfo(topic);\n}\n\n/**\n * Get MCP server configuration.\n */\nexport function getMcpConfig(): McpConfig {\n return getClient().getMcpConfig();\n}\n"],"mappings":"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","names":[]}
|