skrypt-ai 0.6.1 → 0.8.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 (180) hide show
  1. package/dist/audit/doc-parser.d.ts +5 -0
  2. package/dist/audit/doc-parser.js +106 -0
  3. package/dist/audit/index.d.ts +4 -0
  4. package/dist/audit/index.js +4 -0
  5. package/dist/audit/matcher.d.ts +6 -0
  6. package/dist/audit/matcher.js +94 -0
  7. package/dist/audit/reporter.d.ts +9 -0
  8. package/dist/audit/reporter.js +106 -0
  9. package/dist/audit/types.d.ts +37 -0
  10. package/dist/auth/index.js +6 -4
  11. package/dist/cli.js +12 -2
  12. package/dist/commands/audit.d.ts +2 -0
  13. package/dist/commands/audit.js +59 -0
  14. package/dist/commands/config.d.ts +2 -0
  15. package/dist/commands/config.js +73 -0
  16. package/dist/commands/{generate.d.ts → generate/index.d.ts} +1 -0
  17. package/dist/commands/generate/index.js +393 -0
  18. package/dist/commands/generate/scan.d.ts +41 -0
  19. package/dist/commands/generate/scan.js +256 -0
  20. package/dist/commands/generate/verify.d.ts +14 -0
  21. package/dist/commands/generate/verify.js +122 -0
  22. package/dist/commands/generate/write.d.ts +25 -0
  23. package/dist/commands/generate/write.js +120 -0
  24. package/dist/commands/import.js +4 -1
  25. package/dist/commands/llms-txt.js +6 -4
  26. package/dist/commands/refresh.d.ts +2 -0
  27. package/dist/commands/refresh.js +158 -0
  28. package/dist/commands/review.d.ts +2 -0
  29. package/dist/commands/review.js +110 -0
  30. package/dist/commands/test.js +177 -236
  31. package/dist/commands/watch.js +29 -20
  32. package/dist/config/loader.d.ts +6 -2
  33. package/dist/config/loader.js +39 -3
  34. package/dist/config/types.d.ts +7 -0
  35. package/dist/generator/agents-md.d.ts +25 -0
  36. package/dist/generator/agents-md.js +122 -0
  37. package/dist/generator/generator.js +2 -1
  38. package/dist/generator/index.d.ts +2 -0
  39. package/dist/generator/index.js +2 -0
  40. package/dist/generator/mdx-serializer.d.ts +11 -0
  41. package/dist/generator/mdx-serializer.js +135 -0
  42. package/dist/generator/organizer.d.ts +1 -16
  43. package/dist/generator/organizer.js +0 -38
  44. package/dist/generator/types.d.ts +3 -0
  45. package/dist/generator/writer.js +65 -32
  46. package/dist/github/org-discovery.d.ts +17 -0
  47. package/dist/github/org-discovery.js +93 -0
  48. package/dist/llm/index.d.ts +2 -0
  49. package/dist/llm/index.js +8 -2
  50. package/dist/llm/proxy-client.d.ts +32 -0
  51. package/dist/llm/proxy-client.js +103 -0
  52. package/dist/next-actions/actions.d.ts +2 -0
  53. package/dist/next-actions/actions.js +190 -0
  54. package/dist/next-actions/index.d.ts +6 -0
  55. package/dist/next-actions/index.js +39 -0
  56. package/dist/next-actions/setup.d.ts +2 -0
  57. package/dist/next-actions/setup.js +72 -0
  58. package/dist/next-actions/state.d.ts +7 -0
  59. package/dist/next-actions/state.js +68 -0
  60. package/dist/next-actions/suggest.d.ts +3 -0
  61. package/dist/next-actions/suggest.js +47 -0
  62. package/dist/next-actions/types.d.ts +26 -0
  63. package/dist/refresh/differ.d.ts +9 -0
  64. package/dist/refresh/differ.js +67 -0
  65. package/dist/refresh/index.d.ts +4 -0
  66. package/dist/refresh/index.js +4 -0
  67. package/dist/refresh/manifest.d.ts +18 -0
  68. package/dist/refresh/manifest.js +71 -0
  69. package/dist/refresh/splicer.d.ts +9 -0
  70. package/dist/refresh/splicer.js +50 -0
  71. package/dist/refresh/types.d.ts +37 -0
  72. package/dist/review/index.d.ts +8 -0
  73. package/dist/review/index.js +94 -0
  74. package/dist/review/parser.d.ts +16 -0
  75. package/dist/review/parser.js +95 -0
  76. package/dist/review/types.d.ts +18 -0
  77. package/dist/scanner/csharp.d.ts +0 -4
  78. package/dist/scanner/csharp.js +9 -49
  79. package/dist/scanner/go.d.ts +0 -3
  80. package/dist/scanner/go.js +8 -35
  81. package/dist/scanner/java.d.ts +0 -4
  82. package/dist/scanner/java.js +9 -49
  83. package/dist/scanner/kotlin.d.ts +0 -3
  84. package/dist/scanner/kotlin.js +6 -33
  85. package/dist/scanner/php.d.ts +0 -10
  86. package/dist/scanner/php.js +11 -55
  87. package/dist/scanner/ruby.d.ts +0 -3
  88. package/dist/scanner/ruby.js +8 -38
  89. package/dist/scanner/rust.d.ts +0 -3
  90. package/dist/scanner/rust.js +10 -37
  91. package/dist/scanner/swift.d.ts +0 -3
  92. package/dist/scanner/swift.js +8 -35
  93. package/dist/scanner/types.d.ts +2 -0
  94. package/dist/scanner/utils.d.ts +41 -0
  95. package/dist/scanner/utils.js +97 -0
  96. package/dist/structure/index.d.ts +19 -0
  97. package/dist/structure/index.js +92 -0
  98. package/dist/structure/planner.d.ts +8 -0
  99. package/dist/structure/planner.js +180 -0
  100. package/dist/structure/topology.d.ts +16 -0
  101. package/dist/structure/topology.js +49 -0
  102. package/dist/structure/types.d.ts +26 -0
  103. package/dist/template/docs.json +5 -2
  104. package/dist/template/next.config.mjs +31 -0
  105. package/dist/template/package.json +5 -3
  106. package/dist/template/src/app/layout.tsx +13 -13
  107. package/dist/template/src/app/llms-full.md/route.ts +29 -0
  108. package/dist/template/src/app/llms.txt/route.ts +29 -0
  109. package/dist/template/src/app/md/[...slug]/route.ts +174 -0
  110. package/dist/template/src/app/reference/route.ts +22 -18
  111. package/dist/template/src/app/sitemap.ts +1 -1
  112. package/dist/template/src/components/ai-chat-impl.tsx +206 -0
  113. package/dist/template/src/components/ai-chat.tsx +20 -193
  114. package/dist/template/src/components/mdx/index.tsx +27 -4
  115. package/dist/template/src/lib/fonts.ts +135 -0
  116. package/dist/template/src/middleware.ts +101 -0
  117. package/dist/template/src/styles/globals.css +28 -20
  118. package/dist/testing/comparator.d.ts +7 -0
  119. package/dist/testing/comparator.js +77 -0
  120. package/dist/testing/docker.d.ts +21 -0
  121. package/dist/testing/docker.js +234 -0
  122. package/dist/testing/env.d.ts +16 -0
  123. package/dist/testing/env.js +58 -0
  124. package/dist/testing/extractor.d.ts +9 -0
  125. package/dist/testing/extractor.js +195 -0
  126. package/dist/testing/index.d.ts +6 -0
  127. package/dist/testing/index.js +6 -0
  128. package/dist/testing/runner.d.ts +5 -0
  129. package/dist/testing/runner.js +225 -0
  130. package/dist/testing/types.d.ts +58 -0
  131. package/dist/utils/files.d.ts +0 -8
  132. package/dist/utils/files.js +0 -33
  133. package/package.json +1 -1
  134. package/dist/autofix/autofix.test.js +0 -487
  135. package/dist/commands/generate.js +0 -445
  136. package/dist/generator/generator.test.js +0 -259
  137. package/dist/generator/writer.test.js +0 -411
  138. package/dist/llm/llm.manual-test.js +0 -112
  139. package/dist/llm/llm.mock-test.d.ts +0 -4
  140. package/dist/llm/llm.mock-test.js +0 -79
  141. package/dist/plugins/index.d.ts +0 -47
  142. package/dist/plugins/index.js +0 -181
  143. package/dist/scanner/content-type.test.js +0 -231
  144. package/dist/scanner/integration.test.d.ts +0 -4
  145. package/dist/scanner/integration.test.js +0 -180
  146. package/dist/scanner/scanner.test.js +0 -210
  147. package/dist/scanner/typescript.manual-test.d.ts +0 -1
  148. package/dist/scanner/typescript.manual-test.js +0 -112
  149. package/dist/template/src/app/docs/auth/page.mdx +0 -589
  150. package/dist/template/src/app/docs/autofix/page.mdx +0 -624
  151. package/dist/template/src/app/docs/cli/page.mdx +0 -217
  152. package/dist/template/src/app/docs/config/page.mdx +0 -428
  153. package/dist/template/src/app/docs/configuration/page.mdx +0 -86
  154. package/dist/template/src/app/docs/deployment/page.mdx +0 -112
  155. package/dist/template/src/app/docs/generator/generator.md +0 -504
  156. package/dist/template/src/app/docs/generator/organizer.md +0 -779
  157. package/dist/template/src/app/docs/generator/page.mdx +0 -613
  158. package/dist/template/src/app/docs/github/page.mdx +0 -502
  159. package/dist/template/src/app/docs/llm/anthropic-client.md +0 -549
  160. package/dist/template/src/app/docs/llm/index.md +0 -471
  161. package/dist/template/src/app/docs/llm/page.mdx +0 -428
  162. package/dist/template/src/app/docs/plugins/page.mdx +0 -1793
  163. package/dist/template/src/app/docs/pro/page.mdx +0 -121
  164. package/dist/template/src/app/docs/quickstart/page.mdx +0 -93
  165. package/dist/template/src/app/docs/scanner/content-type.md +0 -599
  166. package/dist/template/src/app/docs/scanner/index.md +0 -212
  167. package/dist/template/src/app/docs/scanner/page.mdx +0 -307
  168. package/dist/template/src/app/docs/scanner/python.md +0 -469
  169. package/dist/template/src/app/docs/scanner/python_parser.md +0 -1056
  170. package/dist/template/src/app/docs/scanner/rust.md +0 -325
  171. package/dist/template/src/app/docs/scanner/typescript.md +0 -201
  172. package/dist/template/src/app/icon.tsx +0 -29
  173. package/dist/utils/validation.d.ts +0 -1
  174. package/dist/utils/validation.js +0 -12
  175. /package/dist/{autofix/autofix.test.d.ts → audit/types.js} +0 -0
  176. /package/dist/{generator/generator.test.d.ts → next-actions/types.js} +0 -0
  177. /package/dist/{generator/writer.test.d.ts → refresh/types.js} +0 -0
  178. /package/dist/{llm/llm.manual-test.d.ts → review/types.js} +0 -0
  179. /package/dist/{scanner/content-type.test.d.ts → structure/types.js} +0 -0
  180. /package/dist/{scanner/scanner.test.d.ts → testing/types.js} +0 -0
@@ -0,0 +1,158 @@
1
+ import { Command } from 'commander';
2
+ import { existsSync } from 'fs';
3
+ import { resolve } from 'path';
4
+ import { requirePro } from '../auth/index.js';
5
+ import { scanDirectory } from '../scanner/index.js';
6
+ import { createLLMClient } from '../llm/index.js';
7
+ import { generateForElement } from '../generator/generator.js';
8
+ import { loadConfig, checkApiKey } from '../config/index.js';
9
+ import { readManifest, writeManifest, buildManifestEntries } from '../refresh/manifest.js';
10
+ import { getChangedFiles, findStaleElements } from '../refresh/differ.js';
11
+ import { spliceDocSection, removeDocSection } from '../refresh/splicer.js';
12
+ export const refreshCommand = new Command('refresh')
13
+ .description('Refresh stale documentation based on code changes')
14
+ .argument('[source]', 'Source code directory', '.')
15
+ .option('--docs <dir>', 'Documentation directory', './docs')
16
+ .option('--since <ref>', 'Git ref to compare against (e.g. HEAD~3, 2026-03-01)', 'HEAD~1')
17
+ .option('-c, --config <file>', 'Config file path')
18
+ .option('--provider <name>', 'LLM provider')
19
+ .option('--model <name>', 'LLM model name')
20
+ .action(async (source, options) => {
21
+ try {
22
+ if (!await requirePro('refresh')) {
23
+ process.exit(1);
24
+ }
25
+ const sourcePath = resolve(source);
26
+ const docsPath = resolve(options.docs || './docs');
27
+ if (!existsSync(sourcePath)) {
28
+ console.error(`Error: Source directory not found: ${sourcePath}`);
29
+ process.exit(1);
30
+ }
31
+ if (!existsSync(docsPath)) {
32
+ console.error(`Error: Docs directory not found: ${docsPath}`);
33
+ process.exit(1);
34
+ }
35
+ console.log('skrypt refresh');
36
+ console.log(` source: ${sourcePath}`);
37
+ console.log(` docs: ${docsPath}`);
38
+ console.log(` since: ${options.since || 'HEAD~1'}`);
39
+ console.log('');
40
+ // Read existing manifest
41
+ const manifest = readManifest(docsPath);
42
+ if (!manifest) {
43
+ console.log(' No manifest found. Run `skrypt generate` first to create a manifest.');
44
+ console.log(' The manifest tracks which code elements map to which doc files.');
45
+ process.exit(1);
46
+ }
47
+ console.log(` Manifest: generated ${manifest.generatedAt} (${manifest.commitSha})`);
48
+ console.log(` Elements tracked: ${manifest.elements.length}`);
49
+ console.log('');
50
+ // Get changed files
51
+ console.log('Finding changed files...');
52
+ const since = options.since || 'HEAD~1';
53
+ let changedFiles;
54
+ try {
55
+ changedFiles = getChangedFiles(since);
56
+ }
57
+ catch (err) {
58
+ console.error(`Error: ${err instanceof Error ? err.message : err}`);
59
+ process.exit(1);
60
+ return;
61
+ }
62
+ if (changedFiles.length === 0) {
63
+ console.log(' No source files changed since ' + since);
64
+ console.log('\nAll documentation is up to date!');
65
+ return;
66
+ }
67
+ console.log(` ${changedFiles.length} file(s) changed`);
68
+ // Find stale elements
69
+ console.log('\nChecking for stale documentation...');
70
+ const staleElements = await findStaleElements(manifest, changedFiles);
71
+ if (staleElements.length === 0) {
72
+ console.log(' No stale documentation found.');
73
+ console.log('\nAll documentation is up to date!');
74
+ return;
75
+ }
76
+ console.log(` ${staleElements.length} element(s) need updating`);
77
+ console.log('');
78
+ // Set up LLM client for regeneration
79
+ const config = loadConfig(options.config);
80
+ if (options.provider)
81
+ config.llm.provider = options.provider;
82
+ if (options.model)
83
+ config.llm.model = options.model;
84
+ const { ok, envKey } = checkApiKey(config.llm.provider);
85
+ if (!ok && envKey) {
86
+ console.error(`Error: ${envKey} required for ${config.llm.provider}`);
87
+ process.exit(1);
88
+ }
89
+ const client = createLLMClient({
90
+ provider: config.llm.provider,
91
+ model: config.llm.model,
92
+ });
93
+ // Regenerate stale elements
94
+ let regenerated = 0;
95
+ let removed = 0;
96
+ for (const stale of staleElements) {
97
+ if (stale.newSignature === '[REMOVED]') {
98
+ // Element was deleted from code
99
+ console.log(` \x1b[31m✗ removed\x1b[0m ${stale.entry.name}`);
100
+ removeDocSection(stale.entry.docFile, stale.entry.name);
101
+ removed++;
102
+ continue;
103
+ }
104
+ console.log(` \x1b[33m↻ updating\x1b[0m ${stale.entry.name}`);
105
+ // Re-scan to get the full element context
106
+ try {
107
+ const scanResult = await scanDirectory(stale.entry.sourceFile);
108
+ const element = scanResult.files
109
+ .flatMap(f => f.elements)
110
+ .find(el => el.name === stale.entry.name && el.kind === stale.entry.kind);
111
+ if (!element) {
112
+ console.log(` Could not find element in source — skipping`);
113
+ continue;
114
+ }
115
+ const doc = await generateForElement(element, client, {});
116
+ if (doc.error) {
117
+ console.log(` \x1b[31mGeneration failed: ${doc.error.slice(0, 60)}\x1b[0m`);
118
+ continue;
119
+ }
120
+ // Build the new section content
121
+ const lang = doc.codeLanguage;
122
+ let section = `### \`${element.name}\`\n\n`;
123
+ section += `\`\`\`${lang}\n${element.signature}\n\`\`\`\n\n`;
124
+ if (doc.markdown)
125
+ section += doc.markdown + '\n\n';
126
+ if (doc.codeExample) {
127
+ section += '**Example:**\n\n';
128
+ section += `\`\`\`${lang}\n${doc.codeExample}\n\`\`\`\n\n`;
129
+ }
130
+ spliceDocSection(stale.entry.docFile, stale.entry.name, section);
131
+ regenerated++;
132
+ }
133
+ catch (err) {
134
+ console.log(` Error: ${err instanceof Error ? err.message : err}`);
135
+ }
136
+ }
137
+ const unchanged = manifest.elements.length - regenerated - removed;
138
+ // Update manifest
139
+ console.log('\nUpdating manifest...');
140
+ const scanResult = await scanDirectory(sourcePath);
141
+ const allElements = scanResult.files.flatMap(f => f.elements);
142
+ const newEntries = buildManifestEntries(allElements, docsPath);
143
+ writeManifest(docsPath, newEntries);
144
+ console.log('\n=== Refresh Summary ===');
145
+ console.log(` Regenerated: ${regenerated}`);
146
+ console.log(` Removed: ${removed}`);
147
+ console.log(` Unchanged: ${unchanged}`);
148
+ console.log(` Total: ${manifest.elements.length}`);
149
+ const savings = manifest.elements.length > 0
150
+ ? Math.round((unchanged / manifest.elements.length) * 100)
151
+ : 0;
152
+ console.log(`\n Saved ~${savings}% LLM cost vs full regeneration`);
153
+ }
154
+ catch (err) {
155
+ console.error(`Error: ${err instanceof Error ? err.message : err}`);
156
+ process.exit(1);
157
+ }
158
+ });
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const reviewCommand: Command;
@@ -0,0 +1,110 @@
1
+ import { Command } from 'commander';
2
+ import { existsSync } from 'fs';
3
+ import { resolve, relative, isAbsolute } from 'path';
4
+ import { requirePro } from '../auth/index.js';
5
+ import { loadConfig, checkApiKey } from '../config/index.js';
6
+ import { createLLMClient } from '../llm/index.js';
7
+ import { parseFeedbackFile, parseInlineComments, applyFeedback } from '../review/index.js';
8
+ export const reviewCommand = new Command('review')
9
+ .description('Incorporate feedback into documentation')
10
+ .argument('[docs]', 'Documentation directory', './docs')
11
+ .option('--feedback <file>', 'Feedback file (markdown format)')
12
+ .option('--inline', 'Process <!-- FIXME: --> and <!-- TODO: --> comments in docs')
13
+ .option('-c, --config <file>', 'Config file path')
14
+ .option('--provider <name>', 'LLM provider')
15
+ .option('--model <name>', 'LLM model name')
16
+ .action(async (docs, options) => {
17
+ try {
18
+ if (!await requirePro('review')) {
19
+ process.exit(1);
20
+ }
21
+ const docsPath = resolve(docs);
22
+ if (!existsSync(docsPath)) {
23
+ console.error(`Error: Docs directory not found: ${docsPath}`);
24
+ process.exit(1);
25
+ }
26
+ if (!options.feedback && !options.inline) {
27
+ console.error('Error: Specify --feedback <file> or --inline');
28
+ process.exit(1);
29
+ }
30
+ console.log('skrypt review');
31
+ console.log(` docs: ${docsPath}`);
32
+ if (options.feedback)
33
+ console.log(` feedback: ${options.feedback}`);
34
+ if (options.inline)
35
+ console.log(' mode: inline (FIXME/TODO comments)');
36
+ console.log('');
37
+ // Collect feedback items
38
+ const feedbackItems = [];
39
+ if (options.feedback) {
40
+ const feedbackPath = resolve(options.feedback);
41
+ if (!existsSync(feedbackPath)) {
42
+ console.error(`Error: Feedback file not found: ${feedbackPath}`);
43
+ process.exit(1);
44
+ }
45
+ const rawItems = parseFeedbackFile(feedbackPath);
46
+ // Resolve relative filePaths from feedback to absolute paths
47
+ for (const item of rawItems) {
48
+ if (!isAbsolute(item.filePath)) {
49
+ item.filePath = resolve(item.filePath);
50
+ }
51
+ }
52
+ feedbackItems.push(...rawItems);
53
+ }
54
+ if (options.inline) {
55
+ feedbackItems.push(...parseInlineComments(docsPath));
56
+ }
57
+ if (feedbackItems.length === 0) {
58
+ console.log('No feedback items found.');
59
+ return;
60
+ }
61
+ console.log(`Found ${feedbackItems.length} feedback item(s)\n`);
62
+ // Set up LLM client
63
+ const config = loadConfig(options.config);
64
+ if (options.provider)
65
+ config.llm.provider = options.provider;
66
+ if (options.model)
67
+ config.llm.model = options.model;
68
+ const { ok, envKey } = checkApiKey(config.llm.provider);
69
+ if (!ok && envKey) {
70
+ console.error(`Error: ${envKey} required for ${config.llm.provider}`);
71
+ process.exit(1);
72
+ }
73
+ const client = createLLMClient({
74
+ provider: config.llm.provider,
75
+ model: config.llm.model,
76
+ });
77
+ // Apply feedback
78
+ let applied = 0;
79
+ let failed = 0;
80
+ for (const item of feedbackItems) {
81
+ const location = item.lineNumber ? `:${item.lineNumber}` : '';
82
+ const element = item.elementName ? ` (${item.elementName})` : '';
83
+ const relPath = relative(docsPath, item.filePath);
84
+ const displayPath = relPath.startsWith('..') ? item.filePath : relPath;
85
+ process.stdout.write(` Processing ${displayPath}${location}${element}...`);
86
+ const result = await applyFeedback(item, client);
87
+ if (result.applied) {
88
+ console.log(' \x1b[32m✓\x1b[0m');
89
+ applied++;
90
+ }
91
+ else {
92
+ console.log(` \x1b[31m✗\x1b[0m ${result.error?.slice(0, 60) || 'unknown error'}`);
93
+ failed++;
94
+ }
95
+ }
96
+ console.log('\n=== Review Summary ===');
97
+ console.log(` Applied: ${applied}`);
98
+ if (failed > 0) {
99
+ console.log(` Failed: ${failed}`);
100
+ }
101
+ console.log(` Total: ${feedbackItems.length}`);
102
+ if (failed > 0) {
103
+ process.exit(1);
104
+ }
105
+ }
106
+ catch (err) {
107
+ console.error(`Error: ${err instanceof Error ? err.message : err}`);
108
+ process.exit(1);
109
+ }
110
+ });