docit-ai 1.0.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 (81) hide show
  1. package/.env.example +1 -0
  2. package/INSTRUCTIONS.MD +70 -0
  3. package/dist/ai/engine.d.ts +24 -0
  4. package/dist/ai/engine.d.ts.map +1 -0
  5. package/dist/ai/engine.js +69 -0
  6. package/dist/ai/engine.js.map +1 -0
  7. package/dist/ai/prompts.d.ts +11 -0
  8. package/dist/ai/prompts.d.ts.map +1 -0
  9. package/dist/ai/prompts.js +116 -0
  10. package/dist/ai/prompts.js.map +1 -0
  11. package/dist/cli/index.d.ts +3 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +384 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/formatter/index.d.ts +13 -0
  16. package/dist/formatter/index.d.ts.map +1 -0
  17. package/dist/formatter/index.js +76 -0
  18. package/dist/formatter/index.js.map +1 -0
  19. package/dist/index.d.ts +7 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +9 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/parser/extractor.d.ts +23 -0
  24. package/dist/parser/extractor.d.ts.map +1 -0
  25. package/dist/parser/extractor.js +148 -0
  26. package/dist/parser/extractor.js.map +1 -0
  27. package/dist/scanner/index.d.ts +11 -0
  28. package/dist/scanner/index.d.ts.map +1 -0
  29. package/dist/scanner/index.js +30 -0
  30. package/dist/scanner/index.js.map +1 -0
  31. package/package.json +31 -0
  32. package/server/.env.example +22 -0
  33. package/server/package-lock.json +4426 -0
  34. package/server/package.json +31 -0
  35. package/server/src/config/database.d.ts +18 -0
  36. package/server/src/config/database.d.ts.map +1 -0
  37. package/server/src/config/database.js +8 -0
  38. package/server/src/config/database.js.map +1 -0
  39. package/server/src/config/database.ts +31 -0
  40. package/server/src/index.d.ts +2 -0
  41. package/server/src/index.d.ts.map +1 -0
  42. package/server/src/index.js +33 -0
  43. package/server/src/index.js.map +1 -0
  44. package/server/src/index.ts +55 -0
  45. package/server/src/middleware/auth.d.ts +12 -0
  46. package/server/src/middleware/auth.d.ts.map +1 -0
  47. package/server/src/middleware/auth.js +35 -0
  48. package/server/src/middleware/auth.js.map +1 -0
  49. package/server/src/middleware/auth.ts +56 -0
  50. package/server/src/routes/auth.d.ts +3 -0
  51. package/server/src/routes/auth.d.ts.map +1 -0
  52. package/server/src/routes/auth.js +145 -0
  53. package/server/src/routes/auth.js.map +1 -0
  54. package/server/src/routes/auth.ts +185 -0
  55. package/server/src/routes/dashboard.ts +243 -0
  56. package/server/src/routes/generate.d.ts +3 -0
  57. package/server/src/routes/generate.d.ts.map +1 -0
  58. package/server/src/routes/generate.js +55 -0
  59. package/server/src/routes/generate.js.map +1 -0
  60. package/server/src/routes/generate.ts +75 -0
  61. package/server/src/routes/payment.ts +192 -0
  62. package/server/src/services/ai.d.ts +10 -0
  63. package/server/src/services/ai.d.ts.map +1 -0
  64. package/server/src/services/ai.js +75 -0
  65. package/server/src/services/ai.js.map +1 -0
  66. package/server/src/services/ai.ts +99 -0
  67. package/server/src/services/payment.ts +141 -0
  68. package/server/src/types/flutterwave.d.ts +60 -0
  69. package/server/supabase_payments.sql +35 -0
  70. package/server/supabase_schema.sql +90 -0
  71. package/server/tsconfig.json +17 -0
  72. package/server/vercel.json +15 -0
  73. package/server/verify_dashboard.ts +126 -0
  74. package/src/ai/engine.ts +103 -0
  75. package/src/ai/prompts.ts +123 -0
  76. package/src/cli/index.ts +552 -0
  77. package/src/formatter/index.ts +110 -0
  78. package/src/index.ts +11 -0
  79. package/src/parser/extractor.ts +211 -0
  80. package/src/scanner/index.ts +49 -0
  81. package/tsconfig.json +43 -0
@@ -0,0 +1,384 @@
1
+ import { Command } from "commander";
2
+ import * as dotenv from "dotenv";
3
+ import * as fs from "fs";
4
+ import * as path from "path";
5
+ import * as os from "os";
6
+ import * as crypto from "crypto";
7
+ import * as readline from "readline";
8
+ import { getModifiedTypeScriptFiles } from "../scanner/index.js";
9
+ import { analyzeFile, formatSkeletonForLLM } from "../parser/extractor.js";
10
+ import { formatDocumentation, writeDocumentation } from "../formatter/index.js";
11
+ dotenv.config();
12
+ const LOCK_FILE_PATH = "./docit.lock";
13
+ const CREDENTIALS_DIR = path.join(os.homedir(), ".docit");
14
+ const CREDENTIALS_FILE = path.join(CREDENTIALS_DIR, "credentials.json");
15
+ const DEFAULT_API_URL = "http://localhost:3001";
16
+ function loadLockFile() {
17
+ try {
18
+ if (fs.existsSync(LOCK_FILE_PATH)) {
19
+ const content = fs.readFileSync(LOCK_FILE_PATH, "utf-8");
20
+ return JSON.parse(content);
21
+ }
22
+ }
23
+ catch {
24
+ // Ignore parse errors, return empty lock file
25
+ }
26
+ return {};
27
+ }
28
+ function saveLockFile(lockFile) {
29
+ fs.writeFileSync(LOCK_FILE_PATH, JSON.stringify(lockFile, null, 2), "utf-8");
30
+ }
31
+ function computeFileHash(filePath) {
32
+ const content = fs.readFileSync(filePath, "utf-8");
33
+ return crypto.createHash("md5").update(content).digest("hex");
34
+ }
35
+ function shouldProcessFile(filePath, lockFile) {
36
+ const currentHash = computeFileHash(filePath);
37
+ const entry = lockFile[filePath];
38
+ if (!entry)
39
+ return true;
40
+ return entry.hash !== currentHash;
41
+ }
42
+ function loadCredentials() {
43
+ try {
44
+ if (fs.existsSync(CREDENTIALS_FILE)) {
45
+ const content = fs.readFileSync(CREDENTIALS_FILE, "utf-8");
46
+ return JSON.parse(content);
47
+ }
48
+ }
49
+ catch {
50
+ // Ignore errors
51
+ }
52
+ return null;
53
+ }
54
+ function saveCredentials(credentials) {
55
+ if (!fs.existsSync(CREDENTIALS_DIR)) {
56
+ fs.mkdirSync(CREDENTIALS_DIR, { recursive: true });
57
+ }
58
+ fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(credentials, null, 2), "utf-8");
59
+ }
60
+ function deleteCredentials() {
61
+ if (fs.existsSync(CREDENTIALS_FILE)) {
62
+ fs.unlinkSync(CREDENTIALS_FILE);
63
+ }
64
+ }
65
+ async function prompt(question, hidden = false) {
66
+ const rl = readline.createInterface({
67
+ input: process.stdin,
68
+ output: process.stdout,
69
+ });
70
+ return new Promise((resolve) => {
71
+ if (hidden) {
72
+ process.stdout.write(question);
73
+ let input = "";
74
+ process.stdin.setRawMode(true);
75
+ process.stdin.resume();
76
+ process.stdin.on("data", (char) => {
77
+ const charStr = char.toString();
78
+ if (charStr === "\n" || charStr === "\r" || charStr === "\u0004") {
79
+ process.stdin.setRawMode(false);
80
+ process.stdin.pause();
81
+ console.log();
82
+ rl.close();
83
+ resolve(input);
84
+ }
85
+ else if (charStr === "\u007F" || charStr === "\b") {
86
+ input = input.slice(0, -1);
87
+ process.stdout.clearLine(0);
88
+ process.stdout.cursorTo(0);
89
+ process.stdout.write(question + "*".repeat(input.length));
90
+ }
91
+ else {
92
+ input += charStr;
93
+ process.stdout.write("*");
94
+ }
95
+ });
96
+ }
97
+ else {
98
+ rl.question(question, (answer) => {
99
+ rl.close();
100
+ resolve(answer);
101
+ });
102
+ }
103
+ });
104
+ }
105
+ async function apiRequest(endpoint, options = {}) {
106
+ const { method = "GET", body, token, apiUrl = DEFAULT_API_URL } = options;
107
+ const headers = {
108
+ "Content-Type": "application/json",
109
+ };
110
+ if (token) {
111
+ headers["Authorization"] = `Bearer ${token}`;
112
+ }
113
+ const fetchOptions = {
114
+ method,
115
+ headers,
116
+ };
117
+ if (body) {
118
+ fetchOptions.body = JSON.stringify(body);
119
+ }
120
+ const response = await fetch(`${apiUrl}${endpoint}`, fetchOptions);
121
+ const data = (await response.json());
122
+ return { ok: response.ok, status: response.status, data };
123
+ }
124
+ export function createCli() {
125
+ const program = new Command();
126
+ program
127
+ .name("docit")
128
+ .description("AI-powered documentation generator")
129
+ .version("1.0.0");
130
+ // Register command
131
+ program
132
+ .command("register")
133
+ .description("Create a new Docit account")
134
+ .option("--api-url <url>", "API server URL", DEFAULT_API_URL)
135
+ .action(async (options) => {
136
+ console.log("📝 Create your Docit account\n");
137
+ const email = await prompt("Email: ");
138
+ const password = await prompt("Password: ", true);
139
+ const name = await prompt("Name (optional): ");
140
+ const country = await prompt("Country (e.g., Nigeria, USA): ");
141
+ console.log("\n🔄 Creating account...");
142
+ const result = await apiRequest("/api/auth/register", {
143
+ method: "POST",
144
+ body: {
145
+ email,
146
+ password,
147
+ name: name || undefined,
148
+ country: country || undefined,
149
+ },
150
+ apiUrl: options.apiUrl,
151
+ });
152
+ if (!result.ok) {
153
+ console.error(`❌ Error: ${result.data["error"] ?? "Registration failed"}`);
154
+ process.exit(1);
155
+ }
156
+ const { token, user } = result.data;
157
+ saveCredentials({ token, email: user.email, apiUrl: options.apiUrl });
158
+ console.log(`\n✅ Account created successfully!`);
159
+ console.log(` Email: ${user.email}`);
160
+ console.log(` Credits: ${user.credits}`);
161
+ console.log(`\nYou can now run 'docit sync' to generate documentation.`);
162
+ });
163
+ // Login command
164
+ program
165
+ .command("login")
166
+ .description("Login to your Docit account")
167
+ .option("--api-url <url>", "API server URL", DEFAULT_API_URL)
168
+ .action(async (options) => {
169
+ console.log("🔐 Login to Docit\n");
170
+ const email = await prompt("Email: ");
171
+ const password = await prompt("Password: ", true);
172
+ console.log("\n🔄 Logging in...");
173
+ const result = await apiRequest("/api/auth/login", {
174
+ method: "POST",
175
+ body: { email, password },
176
+ apiUrl: options.apiUrl,
177
+ });
178
+ if (!result.ok) {
179
+ console.error(`❌ Error: ${result.data["error"] ?? "Login failed"}`);
180
+ process.exit(1);
181
+ }
182
+ const { token, user } = result.data;
183
+ saveCredentials({ token, email: user.email, apiUrl: options.apiUrl });
184
+ console.log(`\n✅ Logged in successfully!`);
185
+ console.log(` Email: ${user.email}`);
186
+ console.log(` Credits: ${user.credits}`);
187
+ });
188
+ // Logout command
189
+ program
190
+ .command("logout")
191
+ .description("Logout from your Docit account")
192
+ .action(() => {
193
+ deleteCredentials();
194
+ console.log("✅ Logged out successfully.");
195
+ });
196
+ // Status command
197
+ program
198
+ .command("status")
199
+ .description("Check your account status and credits")
200
+ .action(async () => {
201
+ const credentials = loadCredentials();
202
+ if (!credentials) {
203
+ console.error("❌ Not logged in. Run 'docit login' first.");
204
+ process.exit(1);
205
+ }
206
+ const result = await apiRequest("/api/auth/me", {
207
+ token: credentials.token,
208
+ apiUrl: credentials.apiUrl,
209
+ });
210
+ if (!result.ok) {
211
+ console.error("❌ Session expired. Please login again.");
212
+ deleteCredentials();
213
+ process.exit(1);
214
+ }
215
+ const { user } = result.data;
216
+ console.log(`📊 Account Status`);
217
+ console.log(` Email: ${user.email}`);
218
+ console.log(` Credits: ${user.credits}`);
219
+ });
220
+ // Sync command
221
+ program
222
+ .command("sync")
223
+ .description("Sync documentation with code changes")
224
+ .option("-f, --force", "Force regeneration of all documentation")
225
+ .option("-o, --output <path>", "Output path for documentation", "./DOCIT.md")
226
+ .option("--dry-run", "Show what would be processed without making changes")
227
+ .action(async (options) => {
228
+ const credentials = loadCredentials();
229
+ if (!credentials) {
230
+ console.error("❌ Not logged in. Run 'docit login' or 'docit register' first.");
231
+ process.exit(1);
232
+ }
233
+ console.log("🔍 Scanning for modified files...");
234
+ const modifiedFiles = await getModifiedTypeScriptFiles(".");
235
+ if (modifiedFiles.length === 0) {
236
+ console.log("✅ No modified TypeScript files found.");
237
+ return;
238
+ }
239
+ console.log(`📁 Found ${modifiedFiles.length} modified file(s):`);
240
+ modifiedFiles.forEach((f) => console.log(` - ${path.relative(".", f)}`));
241
+ const lockFile = options.force ? {} : loadLockFile();
242
+ const filesToProcess = modifiedFiles.filter((f) => options.force ?? shouldProcessFile(f, lockFile));
243
+ if (filesToProcess.length === 0) {
244
+ console.log("✅ All files are up to date (use --force to regenerate).");
245
+ return;
246
+ }
247
+ if (options.dryRun) {
248
+ console.log("\n🔮 Dry run - would process:");
249
+ filesToProcess.forEach((f) => console.log(` - ${path.relative(".", f)}`));
250
+ console.log(`\n Credits needed: ${filesToProcess.length}`);
251
+ return;
252
+ }
253
+ console.log(`\n📝 Processing ${filesToProcess.length} file(s)...`);
254
+ // Analyze all files
255
+ const analyses = filesToProcess.map((f) => {
256
+ console.log(` Parsing: ${path.relative(".", f)}`);
257
+ return analyzeFile(f);
258
+ });
259
+ // Combine all skeletons
260
+ const combinedSkeleton = analyses
261
+ .map((a) => formatSkeletonForLLM(a))
262
+ .join("\n\n---\n\n");
263
+ console.log("\n🤖 Generating documentation with AI...");
264
+ // Call backend API
265
+ const result = await apiRequest("/api/generate", {
266
+ method: "POST",
267
+ body: {
268
+ codeSkeleton: combinedSkeleton,
269
+ fileCount: filesToProcess.length,
270
+ },
271
+ token: credentials.token,
272
+ apiUrl: credentials.apiUrl,
273
+ });
274
+ if (!result.ok) {
275
+ if (result.status === 402) {
276
+ const { required, available } = result.data;
277
+ console.error(`\n❌ Insufficient credits!`);
278
+ console.error(` Required: ${required}`);
279
+ console.error(` Available: ${available}`);
280
+ console.error(`\n Purchase more credits to continue.`);
281
+ process.exit(1);
282
+ }
283
+ console.error(`\n❌ Error: ${result.data["error"] ?? "Generation failed"}`);
284
+ process.exit(1);
285
+ }
286
+ const { results, creditsUsed, creditsRemaining } = result.data;
287
+ console.log("📄 Formatting documentation...");
288
+ const projectName = path.basename(process.cwd());
289
+ const documentation = formatDocumentation(results.map((r) => ({
290
+ view: r.view,
291
+ content: r.content,
292
+ })), { projectName });
293
+ writeDocumentation(documentation, options.output);
294
+ console.log(`✅ Documentation written to ${options.output}`);
295
+ console.log(`💰 Credits used: ${creditsUsed} | Remaining: ${creditsRemaining}`);
296
+ // Update lock file
297
+ const newLockFile = { ...lockFile };
298
+ for (const filePath of filesToProcess) {
299
+ newLockFile[filePath] = {
300
+ hash: computeFileHash(filePath),
301
+ lastUpdated: new Date().toISOString(),
302
+ };
303
+ }
304
+ saveLockFile(newLockFile);
305
+ console.log("🔒 Lock file updated.");
306
+ });
307
+ // Init command (for reference)
308
+ program
309
+ .command("init")
310
+ .description("Initialize Docit in the current project")
311
+ .action(() => {
312
+ const gitignorePath = "./.gitignore";
313
+ if (fs.existsSync(gitignorePath)) {
314
+ const content = fs.readFileSync(gitignorePath, "utf-8");
315
+ if (!content.includes("docit.lock")) {
316
+ fs.appendFileSync(gitignorePath, "\ndocit.lock\n");
317
+ console.log("✅ Added docit.lock to .gitignore");
318
+ }
319
+ }
320
+ else {
321
+ fs.writeFileSync(gitignorePath, "docit.lock\n", "utf-8");
322
+ console.log("✅ Created .gitignore");
323
+ }
324
+ console.log("\n🎉 Docit initialized! Next steps:");
325
+ console.log(" 1. Run 'docit register' to create an account");
326
+ console.log(" 2. Run 'docit sync' to generate documentation");
327
+ });
328
+ // Subscribe command
329
+ program
330
+ .command("subscribe")
331
+ .description("Subscribe to get more credits")
332
+ .action(async () => {
333
+ const credentials = loadCredentials();
334
+ if (!credentials) {
335
+ console.error("❌ Not logged in. Run 'docit login' first.");
336
+ process.exit(1);
337
+ }
338
+ console.log("💳 Docit Subscription Plans\n");
339
+ // Get plans from API
340
+ const plansResult = await apiRequest("/api/payment/plans", {
341
+ apiUrl: credentials.apiUrl,
342
+ });
343
+ if (!plansResult.ok) {
344
+ console.error("❌ Failed to fetch plans");
345
+ process.exit(1);
346
+ }
347
+ const { plans } = plansResult.data;
348
+ console.log("Available plans:");
349
+ plans.forEach((plan, index) => {
350
+ const symbol = plan.currency === "NGN" ? "₦" : "$";
351
+ console.log(` ${index + 1}. ${plan.name} - ${symbol}${plan.amount.toLocaleString()}/${plan.currency} (${plan.credits} credits)`);
352
+ });
353
+ const choice = await prompt("\nSelect a plan (1 or 2): ");
354
+ const selectedIndex = parseInt(choice, 10) - 1;
355
+ if (isNaN(selectedIndex) ||
356
+ selectedIndex < 0 ||
357
+ selectedIndex >= plans.length) {
358
+ console.error("❌ Invalid selection");
359
+ process.exit(1);
360
+ }
361
+ const selectedPlan = plans[selectedIndex];
362
+ if (!selectedPlan) {
363
+ console.error("❌ Plan not found");
364
+ process.exit(1);
365
+ }
366
+ console.log(`\n🔄 Initiating payment for ${selectedPlan.name}...`);
367
+ const paymentResult = await apiRequest("/api/payment/initiate", {
368
+ method: "POST",
369
+ body: { planId: selectedPlan.id },
370
+ token: credentials.token,
371
+ apiUrl: credentials.apiUrl,
372
+ });
373
+ if (!paymentResult.ok) {
374
+ console.error(`❌ Error: ${paymentResult.data["error"] ?? "Payment failed"}`);
375
+ process.exit(1);
376
+ }
377
+ const { paymentLink } = paymentResult.data;
378
+ console.log("\n✅ Payment link generated!");
379
+ console.log(`\n🔗 Open this link to complete payment:\n ${paymentLink}`);
380
+ console.log("\nAfter payment, your credits will be automatically added.");
381
+ });
382
+ return program;
383
+ }
384
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { DocumentationResult } from "../ai/engine.js";
2
+ /**
3
+ * Formatter Module
4
+ * Generates the DOCIT.md documentation file with the three-view hierarchy.
5
+ */
6
+ export interface FormatterOptions {
7
+ outputPath?: string;
8
+ projectName?: string;
9
+ }
10
+ export declare function formatDocumentation(results: DocumentationResult[], options?: FormatterOptions): string;
11
+ export declare function writeDocumentation(content: string, outputPath?: string): void;
12
+ export declare function appendToChangelog(existingContent: string, newEntry: string): string;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/formatter/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAI3D;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,mBAAmB,EAAE,EAC9B,OAAO,GAAE,gBAAqB,GAC7B,MAAM,CA6DR;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,MAAqB,GAChC,IAAI,CAGN;AAED,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,GACf,MAAM,CAkBR"}
@@ -0,0 +1,76 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ export function formatDocumentation(results, options = {}) {
4
+ const projectName = options.projectName ?? "Project";
5
+ const timestamp = new Date().toISOString().split("T")[0];
6
+ const strategicContent = results.find((r) => r.view === "strategic")?.content ?? "";
7
+ const technicalContent = results.find((r) => r.view === "technical")?.content ?? "";
8
+ const personalContent = results.find((r) => r.view === "personal")?.content ?? "";
9
+ const doc = `# ${projectName} Documentation
10
+
11
+ > Auto-generated by Docit on ${timestamp}
12
+
13
+ ---
14
+
15
+ ## Table of Contents
16
+
17
+ 1. [PM Dashboard (Strategic View)](#pm-dashboard-strategic-view)
18
+ 2. [Developer Reference (Technical View)](#developer-reference-technical-view)
19
+ 3. [Personal Roadmap (Individual View)](#personal-roadmap-individual-view)
20
+
21
+ ---
22
+
23
+ # PM Dashboard (Strategic View)
24
+
25
+ *For Project Managers and Stakeholders*
26
+
27
+ ${strategicContent}
28
+
29
+ ---
30
+
31
+ # Developer Reference (Technical View)
32
+
33
+ *For Developers and Engineers*
34
+
35
+ ${technicalContent}
36
+
37
+ ---
38
+
39
+ # Personal Roadmap (Individual View)
40
+
41
+ *For Solo Developers and Contributors*
42
+
43
+ ${personalContent}
44
+
45
+ ---
46
+
47
+ ## Changelog
48
+
49
+ | Date | Changes |
50
+ |------|---------|
51
+ | ${timestamp} | Documentation generated |
52
+
53
+ ---
54
+
55
+ *Generated by [Docit](https://github.com/docit) - Your AI-powered documentation companion*
56
+ `;
57
+ return doc;
58
+ }
59
+ export function writeDocumentation(content, outputPath = "./DOCIT.md") {
60
+ const absolutePath = path.resolve(outputPath);
61
+ fs.writeFileSync(absolutePath, content, "utf-8");
62
+ }
63
+ export function appendToChangelog(existingContent, newEntry) {
64
+ const changelogPattern = /## Changelog\n\n\| Date \| Changes \|\n\|------\|---------\|\n/;
65
+ const match = existingContent.match(changelogPattern);
66
+ if (match) {
67
+ const insertPosition = (match.index ?? 0) + match[0].length;
68
+ const timestamp = new Date().toISOString().split("T")[0];
69
+ const newRow = `| ${timestamp} | ${newEntry} |\n`;
70
+ return (existingContent.slice(0, insertPosition) +
71
+ newRow +
72
+ existingContent.slice(insertPosition));
73
+ }
74
+ return existingContent;
75
+ }
76
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/formatter/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAY7B,MAAM,UAAU,mBAAmB,CACjC,OAA8B,EAC9B,UAA4B,EAAE;IAE9B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,SAAS,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzD,MAAM,gBAAgB,GACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;IAC7D,MAAM,gBAAgB,GACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;IAC7D,MAAM,eAAe,GACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;IAE5D,MAAM,GAAG,GAAG,KAAK,WAAW;;+BAEC,SAAS;;;;;;;;;;;;;;;;EAgBtC,gBAAgB;;;;;;;;EAQhB,gBAAgB;;;;;;;;EAQhB,eAAe;;;;;;;;IAQb,SAAS;;;;;CAKZ,CAAC;IAEA,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,OAAe,EACf,aAAqB,YAAY;IAEjC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9C,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,eAAuB,EACvB,QAAgB;IAEhB,MAAM,gBAAgB,GACpB,gEAAgE,CAAC;IACnE,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAEtD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,cAAc,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,KAAK,SAAS,MAAM,QAAQ,MAAM,CAAC;QAElD,OAAO,CACL,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC;YACxC,MAAM;YACN,eAAe,CAAC,KAAK,CAAC,cAAc,CAAC,CACtC,CAAC;IACJ,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Docit - AI-powered documentation generator
4
+ * Entry point for the CLI application
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Docit - AI-powered documentation generator
4
+ * Entry point for the CLI application
5
+ */
6
+ import { createCli } from "./cli/index.js";
7
+ const program = createCli();
8
+ program.parse(process.argv);
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;AAC5B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Parser Module
3
+ * Uses tree-sitter to extract "Code Skeletons" from TypeScript files.
4
+ */
5
+ export interface CodeSkeleton {
6
+ name: string;
7
+ kind: "function" | "class" | "interface" | "type" | "variable" | "export";
8
+ signature: string;
9
+ parameters?: string[] | undefined;
10
+ returnType?: string | undefined;
11
+ comments?: string | undefined;
12
+ startLine: number;
13
+ endLine: number;
14
+ }
15
+ export interface FileAnalysis {
16
+ filePath: string;
17
+ skeletons: CodeSkeleton[];
18
+ todos: string[];
19
+ }
20
+ export declare function extractSkeletons(sourceCode: string): CodeSkeleton[];
21
+ export declare function analyzeFile(filePath: string): FileAnalysis;
22
+ export declare function formatSkeletonForLLM(analysis: FileAnalysis): string;
23
+ //# sourceMappingURL=extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/parser/extractor.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAuHD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,EAAE,CAmCnE;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAQ1D;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAoBnE"}