docworks 0.11.0-next.1

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 (72) hide show
  1. package/README.md +200 -0
  2. package/dist/commands/check.d.ts +7 -0
  3. package/dist/commands/check.d.ts.map +1 -0
  4. package/dist/commands/check.js +61 -0
  5. package/dist/commands/check.js.map +1 -0
  6. package/dist/commands/init.d.ts +5 -0
  7. package/dist/commands/init.d.ts.map +1 -0
  8. package/dist/commands/init.js +165 -0
  9. package/dist/commands/init.js.map +1 -0
  10. package/dist/commands/test.d.ts +5 -0
  11. package/dist/commands/test.d.ts.map +1 -0
  12. package/dist/commands/test.js +45 -0
  13. package/dist/commands/test.js.map +1 -0
  14. package/dist/core/ai.d.ts +2 -0
  15. package/dist/core/ai.d.ts.map +1 -0
  16. package/dist/core/ai.js +29 -0
  17. package/dist/core/ai.js.map +1 -0
  18. package/dist/core/cache.d.ts +3 -0
  19. package/dist/core/cache.d.ts.map +1 -0
  20. package/dist/core/cache.js +31 -0
  21. package/dist/core/cache.js.map +1 -0
  22. package/dist/core/validator.d.ts +4 -0
  23. package/dist/core/validator.d.ts.map +1 -0
  24. package/dist/core/validator.js +47 -0
  25. package/dist/core/validator.js.map +1 -0
  26. package/dist/index.d.ts +3 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +32 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/providers/anthropic.d.ts +10 -0
  31. package/dist/providers/anthropic.d.ts.map +1 -0
  32. package/dist/providers/anthropic.js +51 -0
  33. package/dist/providers/anthropic.js.map +1 -0
  34. package/dist/providers/base.d.ts +12 -0
  35. package/dist/providers/base.d.ts.map +1 -0
  36. package/dist/providers/base.js +14 -0
  37. package/dist/providers/base.js.map +1 -0
  38. package/dist/providers/openai.d.ts +10 -0
  39. package/dist/providers/openai.d.ts.map +1 -0
  40. package/dist/providers/openai.js +42 -0
  41. package/dist/providers/openai.js.map +1 -0
  42. package/dist/sources/base.d.ts +3 -0
  43. package/dist/sources/base.d.ts.map +1 -0
  44. package/dist/sources/base.js +17 -0
  45. package/dist/sources/base.js.map +1 -0
  46. package/dist/sources/llms-txt.d.ts +7 -0
  47. package/dist/sources/llms-txt.d.ts.map +1 -0
  48. package/dist/sources/llms-txt.js +43 -0
  49. package/dist/sources/llms-txt.js.map +1 -0
  50. package/dist/sources/mcp.d.ts +9 -0
  51. package/dist/sources/mcp.d.ts.map +1 -0
  52. package/dist/sources/mcp.js +33 -0
  53. package/dist/sources/mcp.js.map +1 -0
  54. package/dist/types/config.d.ts +26 -0
  55. package/dist/types/config.d.ts.map +1 -0
  56. package/dist/types/config.js +2 -0
  57. package/dist/types/config.js.map +1 -0
  58. package/dist/utils/config.d.ts +3 -0
  59. package/dist/utils/config.d.ts.map +1 -0
  60. package/dist/utils/config.js +18 -0
  61. package/dist/utils/config.js.map +1 -0
  62. package/dist/utils/reporter.d.ts +4 -0
  63. package/dist/utils/reporter.d.ts.map +1 -0
  64. package/dist/utils/reporter.js +111 -0
  65. package/dist/utils/reporter.js.map +1 -0
  66. package/package.json +84 -0
  67. package/templates/api.yml +21 -0
  68. package/templates/default.yml +19 -0
  69. package/templates/gitbook.yml +13 -0
  70. package/templates/library.yml +21 -0
  71. package/templates/mintlify.yml +18 -0
  72. package/templates/readme.yml +13 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEjD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAkC,EAClC,IAAY,EACZ,MAAc,EACd,QAAQ,GAAG,IAAI;IAEf,MAAM,OAAO,GAAmB,EAAE,CAAA;IAElC,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,iBAAiB,CACxC,SAAS,EACT,IAAI,EACJ,MAAM,EACN,QAAQ,CACT,CAAA;IACH,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAmB,EACnB,IAAY,EACZ,MAAc,EACd,QAAQ,GAAG,IAAI;IAEf,MAAM,OAAO,GAAuB,EAAE,CAAA;IAEtC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,qBAAqB;QACrB,MAAM,QAAQ,GAAG,MAAM;aACpB,UAAU,CAAC,KAAK,CAAC;aACjB,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,8BAA8B;aACzE,MAAM,CAAC,KAAK,CAAC,CAAA;QAEhB,IAAI,MAAM,GAA4B,IAAI,CAAA;QAE1C,kBAAkB;QAClB,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;QAC9B,CAAC;QAED,+BAA+B;QAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;YACnE,MAAM,GAAG;gBACP,QAAQ;gBACR,GAAG,UAAU;aACd,CAAA;YAED,mBAAmB;YACnB,IAAI,QAAQ,EAAE,CAAC;gBACb,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YAC7B,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAEpB,gBAAgB;QAChB,MAAM,IAAI,GACR,MAAM,CAAC,UAAU,KAAK,KAAK;YACzB,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS;gBAC/B,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,GAAG,CAAA;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,QAAQ,EAAE,CAAC,CAAA;IACtC,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { init } from './commands/init.js';
4
+ import { check } from './commands/check.js';
5
+ import { test } from './commands/test.js';
6
+ const program = new Command();
7
+ program
8
+ .name('docworks')
9
+ .description('Ensure your docs work for developers and AI')
10
+ .version('1.0.0');
11
+ program
12
+ .command('init')
13
+ .description('Initialize DocWorks configuration')
14
+ .option('-t, --template <t>', 'Template: default, api, library', 'default')
15
+ .option('-p, --platform <p>', 'Platform: mintlify, readme, gitbook')
16
+ .action(init);
17
+ program
18
+ .command('check')
19
+ .description('Validate documentation completeness')
20
+ .option('-c, --config <path>', 'Config file', 'docworks.yml')
21
+ .option('-j, --journey <name>', 'Check specific journey')
22
+ .option('--no-cache', 'Disable caching')
23
+ .option('-f, --format <type>', 'Output: terminal, json, github', 'terminal')
24
+ .action(check);
25
+ program
26
+ .command('test')
27
+ .description('Test if AI can complete tasks using your docs')
28
+ .option('-c, --config <path>', 'Config file', 'docworks.yml')
29
+ .option('--ai <task>', 'Task for AI to complete')
30
+ .action(test);
31
+ program.parse();
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAEzC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,oBAAoB,EAAE,iCAAiC,EAAE,SAAS,CAAC;KAC1E,MAAM,CAAC,oBAAoB,EAAE,qCAAqC,CAAC;KACnE,MAAM,CAAC,IAAI,CAAC,CAAA;AAEf,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,qBAAqB,EAAE,aAAa,EAAE,cAAc,CAAC;KAC5D,MAAM,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;KACxD,MAAM,CAAC,YAAY,EAAE,iBAAiB,CAAC;KACvC,MAAM,CAAC,qBAAqB,EAAE,gCAAgC,EAAE,UAAU,CAAC;KAC3E,MAAM,CAAC,KAAK,CAAC,CAAA;AAEhB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,qBAAqB,EAAE,aAAa,EAAE,cAAc,CAAC;KAC5D,MAAM,CAAC,aAAa,EAAE,yBAAyB,CAAC;KAChD,MAAM,CAAC,IAAI,CAAC,CAAA;AAEf,OAAO,CAAC,KAAK,EAAE,CAAA"}
@@ -0,0 +1,10 @@
1
+ import { AIProvider, ValidationResult } from './base.js';
2
+ export declare class AnthropicProvider implements AIProvider {
3
+ name: string;
4
+ private client;
5
+ private model;
6
+ constructor(apiKey: string, model?: string);
7
+ checkAnswerability(question: string, docs: string): Promise<ValidationResult>;
8
+ complete(prompt: string): Promise<string>;
9
+ }
10
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAExD,qBAAa,iBAAkB,YAAW,UAAU;IAClD,IAAI,SAAc;IAClB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,KAAK,CAAQ;gBAET,MAAM,EAAE,MAAM,EAAE,KAAK,SAA+B;IAK1D,kBAAkB,CACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,gBAAgB,CAAC;IAgCtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAehD"}
@@ -0,0 +1,51 @@
1
+ import Anthropic from '@anthropic-ai/sdk';
2
+ export class AnthropicProvider {
3
+ constructor(apiKey, model = 'claude-3-5-sonnet-20241022') {
4
+ this.name = 'anthropic';
5
+ this.client = new Anthropic({ apiKey });
6
+ this.model = model;
7
+ }
8
+ async checkAnswerability(question, docs) {
9
+ const response = await this.client.messages.create({
10
+ model: this.model,
11
+ max_tokens: 150,
12
+ temperature: 0.1,
13
+ messages: [
14
+ {
15
+ role: 'user',
16
+ content: `Given this documentation, can it answer: "${question}"?
17
+
18
+ Documentation:
19
+ ${docs.substring(0, 50000)}
20
+
21
+ Reply with:
22
+ ANSWER: [YES/PARTIAL/NO]
23
+ REASON: [One sentence]
24
+ LOCATION: [Where found, or "Not found"]`,
25
+ },
26
+ ],
27
+ });
28
+ const content = response.content[0].type === 'text' ? response.content[0].text : '';
29
+ return {
30
+ answerable: (content.match(/ANSWER:\s*(YES|PARTIAL|NO)/)?.[1] ||
31
+ 'NO'),
32
+ reason: content.match(/REASON:\s*(.+)/)?.[1] || 'Could not determine',
33
+ location: content.match(/LOCATION:\s*(.+)/)?.[1] || 'Not found',
34
+ };
35
+ }
36
+ async complete(prompt) {
37
+ const response = await this.client.messages.create({
38
+ model: this.model,
39
+ max_tokens: 2000,
40
+ temperature: 0.3,
41
+ messages: [
42
+ {
43
+ role: 'user',
44
+ content: prompt,
45
+ },
46
+ ],
47
+ });
48
+ return response.content[0].type === 'text' ? response.content[0].text : '';
49
+ }
50
+ }
51
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAA;AAGzC,MAAM,OAAO,iBAAiB;IAK5B,YAAY,MAAc,EAAE,KAAK,GAAG,4BAA4B;QAJhE,SAAI,GAAG,WAAW,CAAA;QAKhB,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;QACvC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,QAAgB,EAChB,IAAY;QAEZ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,GAAG;YACf,WAAW,EAAE,GAAG;YAChB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,6CAA6C,QAAQ;;;EAGtE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC;;;;;wCAKc;iBAC/B;aACF;SACF,CAAC,CAAA;QAEF,MAAM,OAAO,GACX,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;QAErE,OAAO;YACL,UAAU,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3D,IAAI,CAAQ;YACd,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,qBAAqB;YACrE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,WAAW;SAChE,CAAA;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,GAAG;YAChB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,MAAM;iBAChB;aACF;SACF,CAAC,CAAA;QAEF,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;IAC5E,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ export interface ValidationResult {
2
+ answerable: 'YES' | 'PARTIAL' | 'NO';
3
+ reason: string;
4
+ location?: string;
5
+ }
6
+ export interface AIProvider {
7
+ name: string;
8
+ checkAnswerability(question: string, docs: string): Promise<ValidationResult>;
9
+ complete(prompt: string): Promise<string>;
10
+ }
11
+ export declare function createProvider(provider: string, apiKey: string, model?: string): AIProvider;
12
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,CAAA;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC7E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CAC1C;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACb,UAAU,CAUZ"}
@@ -0,0 +1,14 @@
1
+ import { OpenAIProvider } from './openai.js';
2
+ import { AnthropicProvider } from './anthropic.js';
3
+ export function createProvider(provider, apiKey, model) {
4
+ switch (provider) {
5
+ case 'anthropic': {
6
+ return new AnthropicProvider(apiKey, model);
7
+ }
8
+ case 'openai':
9
+ default: {
10
+ return new OpenAIProvider(apiKey, model);
11
+ }
12
+ }
13
+ }
14
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAclD,MAAM,UAAU,cAAc,CAC5B,QAAgB,EAChB,MAAc,EACd,KAAc;IAEd,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,OAAO,IAAI,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC7C,CAAC;QACD,KAAK,QAAQ,CAAC;QACd,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,IAAI,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { AIProvider, ValidationResult } from './base.js';
2
+ export declare class OpenAIProvider implements AIProvider {
3
+ name: string;
4
+ private client;
5
+ private model;
6
+ constructor(apiKey: string, model?: string);
7
+ checkAnswerability(question: string, docs: string): Promise<ValidationResult>;
8
+ complete(prompt: string): Promise<string>;
9
+ }
10
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAExD,qBAAa,cAAe,YAAW,UAAU;IAC/C,IAAI,SAAW;IACf,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,KAAK,CAAQ;gBAET,MAAM,EAAE,MAAM,EAAE,KAAK,SAAgB;IAK3C,kBAAkB,CACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,gBAAgB,CAAC;IA4BtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAUhD"}
@@ -0,0 +1,42 @@
1
+ import OpenAI from 'openai';
2
+ export class OpenAIProvider {
3
+ constructor(apiKey, model = 'gpt-4o-mini') {
4
+ this.name = 'openai';
5
+ this.client = new OpenAI({ apiKey });
6
+ this.model = model;
7
+ }
8
+ async checkAnswerability(question, docs) {
9
+ const prompt = `Given this documentation, can it answer: "${question}"?
10
+
11
+ Documentation:
12
+ ${docs.substring(0, 50000)}
13
+
14
+ Reply with:
15
+ ANSWER: [YES/PARTIAL/NO]
16
+ REASON: [One sentence]
17
+ LOCATION: [Where found, or "Not found"]`;
18
+ const response = await this.client.chat.completions.create({
19
+ model: this.model,
20
+ messages: [{ role: 'user', content: prompt }],
21
+ temperature: 0.1,
22
+ max_tokens: 150,
23
+ });
24
+ const content = response.choices[0].message.content || '';
25
+ return {
26
+ answerable: (content.match(/ANSWER:\s*(YES|PARTIAL|NO)/)?.[1] ||
27
+ 'NO'),
28
+ reason: content.match(/REASON:\s*(.+)/)?.[1] || 'Could not determine',
29
+ location: content.match(/LOCATION:\s*(.+)/)?.[1] || 'Not found',
30
+ };
31
+ }
32
+ async complete(prompt) {
33
+ const response = await this.client.chat.completions.create({
34
+ model: this.model,
35
+ messages: [{ role: 'user', content: prompt }],
36
+ temperature: 0.3,
37
+ max_tokens: 2000,
38
+ });
39
+ return response.choices[0].message.content || '';
40
+ }
41
+ }
42
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAG3B,MAAM,OAAO,cAAc;IAKzB,YAAY,MAAc,EAAE,KAAK,GAAG,aAAa;QAJjD,SAAI,GAAG,QAAQ,CAAA;QAKb,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;QACpC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,QAAgB,EAChB,IAAY;QAEZ,MAAM,MAAM,GAAG,6CAA6C,QAAQ;;;EAGtE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC;;;;;wCAKc,CAAA;QAEpC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACzD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAC7C,WAAW,EAAE,GAAG;YAChB,UAAU,EAAE,GAAG;SAChB,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAA;QAEzD,OAAO;YACL,UAAU,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3D,IAAI,CAAQ;YACd,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,qBAAqB;YACrE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,WAAW;SAChE,CAAA;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACzD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAC7C,WAAW,EAAE,GAAG;YAChB,UAAU,EAAE,IAAI;SACjB,CAAC,CAAA;QAEF,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAA;IAClD,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ import { DocSource, DocWorksConfig } from '../types/config.js';
2
+ export declare function createSource(config: DocWorksConfig): Promise<DocSource>;
3
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/sources/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAE9D,wBAAsB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAiB7E"}
@@ -0,0 +1,17 @@
1
+ export async function createSource(config) {
2
+ const sourceConfig = typeof config.source === 'string'
3
+ ? { type: 'llms.txt', path: config.source }
4
+ : config.source;
5
+ switch (sourceConfig.type) {
6
+ case 'mcp': {
7
+ const { MCPSource } = await import('./mcp.js');
8
+ return new MCPSource(sourceConfig.server);
9
+ }
10
+ case 'llms.txt':
11
+ default: {
12
+ const { LLMSTxtSource } = await import('./llms-txt.js');
13
+ return new LLMSTxtSource();
14
+ }
15
+ }
16
+ }
17
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/sources/base.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAsB;IACvD,MAAM,YAAY,GAChB,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;QAC/B,CAAC,CAAC,EAAE,IAAI,EAAE,UAAmB,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;QACpD,CAAC,CAAC,MAAM,CAAC,MAAM,CAAA;IAEnB,QAAQ,YAAY,CAAC,IAAI,EAAE,CAAC;QAC1B,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;YAC9C,OAAO,IAAI,SAAS,CAAC,YAAY,CAAC,MAAO,CAAC,CAAA;QAC5C,CAAC;QACD,KAAK,UAAU,CAAC;QAChB,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAA;YACvD,OAAO,IAAI,aAAa,EAAE,CAAA;QAC5B,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { DocSource } from '../types/config.js';
2
+ export declare class LLMSTxtSource implements DocSource {
3
+ name: string;
4
+ private filepath;
5
+ fetch(): Promise<string>;
6
+ }
7
+ //# sourceMappingURL=llms-txt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llms-txt.d.ts","sourceRoot":"","sources":["../../src/sources/llms-txt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAE9C,qBAAa,aAAc,YAAW,SAAS;IAC7C,IAAI,SAAa;IACjB,OAAO,CAAC,QAAQ,CAAe;IAEzB,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;CA2C/B"}
@@ -0,0 +1,43 @@
1
+ import fs from 'fs';
2
+ export class LLMSTxtSource {
3
+ constructor() {
4
+ this.name = 'llms.txt';
5
+ this.filepath = './llms.txt';
6
+ }
7
+ async fetch() {
8
+ if (!fs.existsSync(this.filepath)) {
9
+ throw new Error('llms.txt not found. Create it with:\n' +
10
+ ' docworks init\n\n' +
11
+ 'Or create manually listing your documentation files.');
12
+ }
13
+ const content = fs.readFileSync(this.filepath, 'utf-8');
14
+ const sources = content
15
+ .split('\n')
16
+ .map((line) => line.trim())
17
+ .filter((line) => line && !line.startsWith('#'));
18
+ if (sources.length === 0) {
19
+ throw new Error('llms.txt is empty. Add your documentation files.');
20
+ }
21
+ const docs = [];
22
+ for (const source of sources) {
23
+ // Handle URLs (future feature)
24
+ if (source.startsWith('http')) {
25
+ console.log(`āš ļø URL sources not yet supported: ${source}`);
26
+ continue;
27
+ }
28
+ // Handle local files
29
+ if (fs.existsSync(source)) {
30
+ const content = fs.readFileSync(source, 'utf-8');
31
+ docs.push(`\n=== ${source} ===\n${content}`);
32
+ }
33
+ else {
34
+ console.warn(`āš ļø File not found: ${source}`);
35
+ }
36
+ }
37
+ if (docs.length === 0) {
38
+ throw new Error('No valid documentation sources found in llms.txt');
39
+ }
40
+ return docs.join('\n\n');
41
+ }
42
+ }
43
+ //# sourceMappingURL=llms-txt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llms-txt.js","sourceRoot":"","sources":["../../src/sources/llms-txt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AAInB,MAAM,OAAO,aAAa;IAA1B;QACE,SAAI,GAAG,UAAU,CAAA;QACT,aAAQ,GAAG,YAAY,CAAA;IA6CjC,CAAC;IA3CC,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CACb,uCAAuC;gBACrC,qBAAqB;gBACrB,sDAAsD,CACzD,CAAA;QACH,CAAC;QAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACvD,MAAM,OAAO,GAAG,OAAO;aACpB,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;QAElD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;QACrE,CAAC;QAED,MAAM,IAAI,GAAa,EAAE,CAAA;QAEzB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,+BAA+B;YAC/B,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,sCAAsC,MAAM,EAAE,CAAC,CAAA;gBAC3D,SAAQ;YACV,CAAC;YAED,qBAAqB;YACrB,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;gBAChD,IAAI,CAAC,IAAI,CAAC,SAAS,MAAM,SAAS,OAAO,EAAE,CAAC,CAAA;YAC9C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAA;YAC/C,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;QACrE,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC1B,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { DocSource } from '../types/config.js';
2
+ export declare class MCPSource implements DocSource {
3
+ private server;
4
+ name: string;
5
+ constructor(server: string);
6
+ fetch(): Promise<string>;
7
+ search(query: string): Promise<string>;
8
+ }
9
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/sources/mcp.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAI9C,qBAAa,SAAU,YAAW,SAAS;IAG7B,OAAO,CAAC,MAAM;IAF1B,IAAI,EAAE,MAAM,CAAA;gBAEQ,MAAM,EAAE,MAAM;IAI5B,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAiBxB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAY7C"}
@@ -0,0 +1,33 @@
1
+ import { exec } from 'child_process';
2
+ import { promisify } from 'util';
3
+ const execAsync = promisify(exec);
4
+ export class MCPSource {
5
+ constructor(server) {
6
+ this.server = server;
7
+ this.name = `MCP: ${server}`;
8
+ }
9
+ async fetch() {
10
+ try {
11
+ // For MVP, execute MCP server command
12
+ // Future: Use proper MCP SDK
13
+ const { stdout } = await execAsync(`npx ${this.server} --list-docs`, { maxBuffer: 10 * 1024 * 1024 } // 10MB buffer
14
+ );
15
+ return stdout;
16
+ }
17
+ catch (error) {
18
+ throw new Error(`Failed to connect to MCP server: ${this.server}\n` +
19
+ `Ensure the server package is installed and accessible.`);
20
+ }
21
+ }
22
+ async search(query) {
23
+ try {
24
+ const { stdout } = await execAsync(`npx ${this.server} --search "${query}"`, { maxBuffer: 10 * 1024 * 1024 });
25
+ return stdout;
26
+ }
27
+ catch {
28
+ // Fallback to full fetch if search not supported
29
+ return this.fetch();
30
+ }
31
+ }
32
+ }
33
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/sources/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAGhC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;AAEjC,MAAM,OAAO,SAAS;IAGpB,YAAoB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QAChC,IAAI,CAAC,IAAI,GAAG,QAAQ,MAAM,EAAE,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC;YACH,sCAAsC;YACtC,6BAA6B;YAC7B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,OAAO,IAAI,CAAC,MAAM,cAAc,EAChC,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,cAAc;aAC/C,CAAA;YACD,OAAO,MAAM,CAAA;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,oCAAoC,IAAI,CAAC,MAAM,IAAI;gBACjD,wDAAwD,CAC3D,CAAA;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa;QACxB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,OAAO,IAAI,CAAC,MAAM,cAAc,KAAK,GAAG,EACxC,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAChC,CAAA;YACD,OAAO,MAAM,CAAA;QACf,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;YACjD,OAAO,IAAI,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ export interface DocWorksConfig {
2
+ source: string | SourceConfig;
3
+ journeys: Record<string, string[]>;
4
+ provider?: 'openai' | 'anthropic';
5
+ model?: string;
6
+ api_key?: string;
7
+ }
8
+ export interface SourceConfig {
9
+ type: 'llms.txt' | 'mcp';
10
+ server?: string;
11
+ }
12
+ export interface ValidationResult {
13
+ question: string;
14
+ answerable: 'YES' | 'PARTIAL' | 'NO';
15
+ reason: string;
16
+ location?: string;
17
+ }
18
+ export interface JourneyResults {
19
+ [journey: string]: ValidationResult[];
20
+ }
21
+ export interface DocSource {
22
+ name: string;
23
+ fetch(): Promise<string>;
24
+ search?(query: string): Promise<string>;
25
+ }
26
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,GAAG,YAAY,CAAA;IAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAClC,QAAQ,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAA;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,GAAG,KAAK,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,CAAA;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAAA;CACtC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;IACxB,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CACxC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { DocWorksConfig } from '../types/config.js';
2
+ export declare function loadConfig(configPath: string): Promise<DocWorksConfig>;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEnD,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAkB5E"}
@@ -0,0 +1,18 @@
1
+ import fs from 'fs';
2
+ import yaml from 'yaml';
3
+ export async function loadConfig(configPath) {
4
+ if (!fs.existsSync(configPath)) {
5
+ throw new Error(`Config file not found: ${configPath}`);
6
+ }
7
+ const content = fs.readFileSync(configPath, 'utf-8');
8
+ const config = yaml.parse(content);
9
+ // Validate config
10
+ if (!config.source) {
11
+ throw new Error('Config missing "source" section');
12
+ }
13
+ if (!config.journeys) {
14
+ throw new Error('Config missing "journeys" section');
15
+ }
16
+ return config;
17
+ }
18
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AAGvB,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB;IACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAA;IACzD,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAElC,kBAAkB;IAClB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACpD,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IACtD,CAAC;IAED,OAAO,MAAwB,CAAA;AACjC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { JourneyResults } from '../types/config.js';
2
+ export declare function formatReport(results: JourneyResults, github?: boolean): number;
3
+ export declare function formatJSON(results: JourneyResults, source: string): string;
4
+ //# sourceMappingURL=reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../src/utils/reporter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEnD,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAQ,GAAG,MAAM,CA2E5E;AA0BD,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA2B1E"}
@@ -0,0 +1,111 @@
1
+ import chalk from 'chalk';
2
+ export function formatReport(results, github = false) {
3
+ let totalQuestions = 0;
4
+ let answeredQuestions = 0;
5
+ let partialQuestions = 0;
6
+ const failedJourneys = [];
7
+ // Calculate stats
8
+ for (const [journey, questions] of Object.entries(results)) {
9
+ const answered = questions.filter((q) => q.answerable === 'YES').length;
10
+ const partial = questions.filter((q) => q.answerable === 'PARTIAL').length;
11
+ const failed = questions.filter((q) => q.answerable === 'NO').length;
12
+ totalQuestions += questions.length;
13
+ answeredQuestions += answered;
14
+ partialQuestions += partial;
15
+ if (failed > 0) {
16
+ failedJourneys.push(journey);
17
+ }
18
+ }
19
+ const score = Math.round((answeredQuestions / totalQuestions) * 100);
20
+ // Format output
21
+ if (github) {
22
+ return formatGitHub(results, score);
23
+ }
24
+ // Terminal output
25
+ console.log('\n' + '═'.repeat(50));
26
+ console.log(chalk.bold('\nšŸ“‹ Documentation Validation Report\n'));
27
+ for (const [journey, questions] of Object.entries(results)) {
28
+ const failed = questions.filter((q) => q.answerable === 'NO');
29
+ const partial = questions.filter((q) => q.answerable === 'PARTIAL');
30
+ const success = questions.filter((q) => q.answerable === 'YES');
31
+ const journeyScore = Math.round((success.length / questions.length) * 100);
32
+ const color = journeyScore >= 80
33
+ ? chalk.green
34
+ : journeyScore >= 50
35
+ ? chalk.yellow
36
+ : chalk.red;
37
+ console.log(chalk.bold(`Journey: ${journey}`));
38
+ console.log(color(` Score: ${journeyScore}%`));
39
+ console.log(` āœ… Complete: ${success.length}`);
40
+ if (partial.length > 0)
41
+ console.log(` āš ļø Partial: ${partial.length}`);
42
+ if (failed.length > 0) {
43
+ console.log(` āŒ Missing: ${failed.length}`);
44
+ for (const q of failed) {
45
+ console.log(chalk.red(` • ${q.question}`));
46
+ }
47
+ }
48
+ console.log();
49
+ }
50
+ // Summary
51
+ console.log('═'.repeat(50));
52
+ console.log(chalk.bold(`\nšŸ“Š Overall Score: ${score}/100\n`));
53
+ if (score >= 80) {
54
+ console.log(chalk.green('āœ… Documentation is AI-ready!'));
55
+ console.log('Developers and AI agents can successfully use your docs.\n');
56
+ return 0;
57
+ }
58
+ else if (score >= 50) {
59
+ console.log(chalk.yellow('āš ļø Documentation needs improvement'));
60
+ console.log('Some journeys cannot be completed.\n');
61
+ return 0;
62
+ }
63
+ else {
64
+ console.log(chalk.red('āŒ Documentation is incomplete'));
65
+ console.log('Many developer journeys will fail.\n');
66
+ return 1;
67
+ }
68
+ }
69
+ function formatGitHub(results, score) {
70
+ // GitHub PR comment format
71
+ console.log('## šŸ“‹ Documentation Check Results\n');
72
+ console.log(`**Score: ${score}/100**\n`);
73
+ for (const [journey, questions] of Object.entries(results)) {
74
+ const failed = questions.filter((q) => q.answerable === 'NO');
75
+ if (failed.length > 0) {
76
+ console.log(`### āŒ Journey: ${journey}`);
77
+ for (const q of failed) {
78
+ console.log(`- ${q.question}`);
79
+ }
80
+ console.log();
81
+ }
82
+ }
83
+ if (score < 50) {
84
+ console.log('āš ļø **This check is failing.** Documentation is incomplete.');
85
+ return 1;
86
+ }
87
+ return 0;
88
+ }
89
+ export function formatJSON(results, source) {
90
+ const stats = {
91
+ total: 0,
92
+ answered: 0,
93
+ partial: 0,
94
+ missing: 0,
95
+ };
96
+ for (const questions of Object.values(results)) {
97
+ stats.total += questions.length;
98
+ stats.answered += questions.filter((q) => q.answerable === 'YES').length;
99
+ stats.partial += questions.filter((q) => q.answerable === 'PARTIAL').length;
100
+ stats.missing += questions.filter((q) => q.answerable === 'NO').length;
101
+ }
102
+ return JSON.stringify({
103
+ version: '1.0.0',
104
+ timestamp: new Date().toISOString(),
105
+ source,
106
+ score: Math.round((stats.answered / stats.total) * 100),
107
+ stats,
108
+ results,
109
+ }, null, 2);
110
+ }
111
+ //# sourceMappingURL=reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/utils/reporter.ts"],"names":[],"mappings":"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"}