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.
- package/README.md +200 -0
- package/dist/commands/check.d.ts +7 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +61 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +165 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/test.d.ts +5 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +45 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/core/ai.d.ts +2 -0
- package/dist/core/ai.d.ts.map +1 -0
- package/dist/core/ai.js +29 -0
- package/dist/core/ai.js.map +1 -0
- package/dist/core/cache.d.ts +3 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +31 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/validator.d.ts +4 -0
- package/dist/core/validator.d.ts.map +1 -0
- package/dist/core/validator.js +47 -0
- package/dist/core/validator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/anthropic.d.ts +10 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +51 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +12 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +14 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/openai.d.ts +10 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +42 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/sources/base.d.ts +3 -0
- package/dist/sources/base.d.ts.map +1 -0
- package/dist/sources/base.js +17 -0
- package/dist/sources/base.js.map +1 -0
- package/dist/sources/llms-txt.d.ts +7 -0
- package/dist/sources/llms-txt.d.ts.map +1 -0
- package/dist/sources/llms-txt.js +43 -0
- package/dist/sources/llms-txt.js.map +1 -0
- package/dist/sources/mcp.d.ts +9 -0
- package/dist/sources/mcp.d.ts.map +1 -0
- package/dist/sources/mcp.js +33 -0
- package/dist/sources/mcp.js.map +1 -0
- package/dist/types/config.d.ts +26 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/utils/config.d.ts +3 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +18 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/reporter.d.ts +4 -0
- package/dist/utils/reporter.d.ts.map +1 -0
- package/dist/utils/reporter.js +111 -0
- package/dist/utils/reporter.js.map +1 -0
- package/package.json +84 -0
- package/templates/api.yml +21 -0
- package/templates/default.yml +19 -0
- package/templates/gitbook.yml +13 -0
- package/templates/library.yml +21 -0
- package/templates/mintlify.yml +18 -0
- 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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":""}
|
|
@@ -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 @@
|
|
|
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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"}
|