afdocs 0.1.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 (136) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +201 -0
  3. package/bin/afdocs.mjs +3 -0
  4. package/dist/checks/agent-discoverability/llms-txt-directive.d.ts +2 -0
  5. package/dist/checks/agent-discoverability/llms-txt-directive.d.ts.map +1 -0
  6. package/dist/checks/agent-discoverability/llms-txt-directive.js +17 -0
  7. package/dist/checks/agent-discoverability/llms-txt-directive.js.map +1 -0
  8. package/dist/checks/content-structure/markdown-code-fence-validity.d.ts +2 -0
  9. package/dist/checks/content-structure/markdown-code-fence-validity.d.ts.map +1 -0
  10. package/dist/checks/content-structure/markdown-code-fence-validity.js +17 -0
  11. package/dist/checks/content-structure/markdown-code-fence-validity.js.map +1 -0
  12. package/dist/checks/content-structure/section-header-quality.d.ts +2 -0
  13. package/dist/checks/content-structure/section-header-quality.d.ts.map +1 -0
  14. package/dist/checks/content-structure/section-header-quality.js +17 -0
  15. package/dist/checks/content-structure/section-header-quality.js.map +1 -0
  16. package/dist/checks/content-structure/tabbed-content-serialization.d.ts +2 -0
  17. package/dist/checks/content-structure/tabbed-content-serialization.d.ts.map +1 -0
  18. package/dist/checks/content-structure/tabbed-content-serialization.js +17 -0
  19. package/dist/checks/content-structure/tabbed-content-serialization.js.map +1 -0
  20. package/dist/checks/index.d.ts +22 -0
  21. package/dist/checks/index.d.ts.map +1 -0
  22. package/dist/checks/index.js +30 -0
  23. package/dist/checks/index.js.map +1 -0
  24. package/dist/checks/llms-txt/llms-txt-exists.d.ts +2 -0
  25. package/dist/checks/llms-txt/llms-txt-exists.d.ts.map +1 -0
  26. package/dist/checks/llms-txt/llms-txt-exists.js +107 -0
  27. package/dist/checks/llms-txt/llms-txt-exists.js.map +1 -0
  28. package/dist/checks/llms-txt/llms-txt-links-markdown.d.ts +2 -0
  29. package/dist/checks/llms-txt/llms-txt-links-markdown.d.ts.map +1 -0
  30. package/dist/checks/llms-txt/llms-txt-links-markdown.js +144 -0
  31. package/dist/checks/llms-txt/llms-txt-links-markdown.js.map +1 -0
  32. package/dist/checks/llms-txt/llms-txt-links-resolve.d.ts +2 -0
  33. package/dist/checks/llms-txt/llms-txt-links-resolve.d.ts.map +1 -0
  34. package/dist/checks/llms-txt/llms-txt-links-resolve.js +116 -0
  35. package/dist/checks/llms-txt/llms-txt-links-resolve.js.map +1 -0
  36. package/dist/checks/llms-txt/llms-txt-size.d.ts +2 -0
  37. package/dist/checks/llms-txt/llms-txt-size.d.ts.map +1 -0
  38. package/dist/checks/llms-txt/llms-txt-size.js +56 -0
  39. package/dist/checks/llms-txt/llms-txt-size.js.map +1 -0
  40. package/dist/checks/llms-txt/llms-txt-valid.d.ts +6 -0
  41. package/dist/checks/llms-txt/llms-txt-valid.d.ts.map +1 -0
  42. package/dist/checks/llms-txt/llms-txt-valid.js +89 -0
  43. package/dist/checks/llms-txt/llms-txt-valid.js.map +1 -0
  44. package/dist/checks/markdown-availability/content-negotiation.d.ts +2 -0
  45. package/dist/checks/markdown-availability/content-negotiation.d.ts.map +1 -0
  46. package/dist/checks/markdown-availability/content-negotiation.js +17 -0
  47. package/dist/checks/markdown-availability/content-negotiation.js.map +1 -0
  48. package/dist/checks/markdown-availability/markdown-url-support.d.ts +2 -0
  49. package/dist/checks/markdown-availability/markdown-url-support.d.ts.map +1 -0
  50. package/dist/checks/markdown-availability/markdown-url-support.js +17 -0
  51. package/dist/checks/markdown-availability/markdown-url-support.js.map +1 -0
  52. package/dist/checks/observability/cache-header-hygiene.d.ts +2 -0
  53. package/dist/checks/observability/cache-header-hygiene.d.ts.map +1 -0
  54. package/dist/checks/observability/cache-header-hygiene.js +17 -0
  55. package/dist/checks/observability/cache-header-hygiene.js.map +1 -0
  56. package/dist/checks/observability/llms-txt-freshness.d.ts +2 -0
  57. package/dist/checks/observability/llms-txt-freshness.d.ts.map +1 -0
  58. package/dist/checks/observability/llms-txt-freshness.js +17 -0
  59. package/dist/checks/observability/llms-txt-freshness.js.map +1 -0
  60. package/dist/checks/observability/markdown-content-parity.d.ts +2 -0
  61. package/dist/checks/observability/markdown-content-parity.d.ts.map +1 -0
  62. package/dist/checks/observability/markdown-content-parity.js +17 -0
  63. package/dist/checks/observability/markdown-content-parity.js.map +1 -0
  64. package/dist/checks/page-size/content-start-position.d.ts +2 -0
  65. package/dist/checks/page-size/content-start-position.d.ts.map +1 -0
  66. package/dist/checks/page-size/content-start-position.js +17 -0
  67. package/dist/checks/page-size/content-start-position.js.map +1 -0
  68. package/dist/checks/page-size/page-size-html.d.ts +2 -0
  69. package/dist/checks/page-size/page-size-html.d.ts.map +1 -0
  70. package/dist/checks/page-size/page-size-html.js +17 -0
  71. package/dist/checks/page-size/page-size-html.js.map +1 -0
  72. package/dist/checks/page-size/page-size-markdown.d.ts +2 -0
  73. package/dist/checks/page-size/page-size-markdown.d.ts.map +1 -0
  74. package/dist/checks/page-size/page-size-markdown.js +17 -0
  75. package/dist/checks/page-size/page-size-markdown.js.map +1 -0
  76. package/dist/checks/registry.d.ts +7 -0
  77. package/dist/checks/registry.d.ts.map +1 -0
  78. package/dist/checks/registry.js +20 -0
  79. package/dist/checks/registry.js.map +1 -0
  80. package/dist/checks/url-stability/http-status-codes.d.ts +2 -0
  81. package/dist/checks/url-stability/http-status-codes.d.ts.map +1 -0
  82. package/dist/checks/url-stability/http-status-codes.js +17 -0
  83. package/dist/checks/url-stability/http-status-codes.js.map +1 -0
  84. package/dist/checks/url-stability/redirect-behavior.d.ts +2 -0
  85. package/dist/checks/url-stability/redirect-behavior.d.ts.map +1 -0
  86. package/dist/checks/url-stability/redirect-behavior.js +17 -0
  87. package/dist/checks/url-stability/redirect-behavior.js.map +1 -0
  88. package/dist/cli/commands/check.d.ts +4 -0
  89. package/dist/cli/commands/check.d.ts.map +1 -0
  90. package/dist/cli/commands/check.js +38 -0
  91. package/dist/cli/commands/check.js.map +1 -0
  92. package/dist/cli/formatters/json.d.ts +3 -0
  93. package/dist/cli/formatters/json.d.ts.map +1 -0
  94. package/dist/cli/formatters/json.js +4 -0
  95. package/dist/cli/formatters/json.js.map +1 -0
  96. package/dist/cli/formatters/text.d.ts +3 -0
  97. package/dist/cli/formatters/text.d.ts.map +1 -0
  98. package/dist/cli/formatters/text.js +59 -0
  99. package/dist/cli/formatters/text.js.map +1 -0
  100. package/dist/cli/index.d.ts +2 -0
  101. package/dist/cli/index.d.ts.map +1 -0
  102. package/dist/cli/index.js +12 -0
  103. package/dist/cli/index.js.map +1 -0
  104. package/dist/constants.d.ts +36 -0
  105. package/dist/constants.d.ts.map +1 -0
  106. package/dist/constants.js +24 -0
  107. package/dist/constants.js.map +1 -0
  108. package/dist/helpers/config.d.ts +3 -0
  109. package/dist/helpers/config.d.ts.map +1 -0
  110. package/dist/helpers/config.js +25 -0
  111. package/dist/helpers/config.js.map +1 -0
  112. package/dist/helpers/index.d.ts +3 -0
  113. package/dist/helpers/index.d.ts.map +1 -0
  114. package/dist/helpers/index.js +3 -0
  115. package/dist/helpers/index.js.map +1 -0
  116. package/dist/helpers/vitest-runner.d.ts +23 -0
  117. package/dist/helpers/vitest-runner.d.ts.map +1 -0
  118. package/dist/helpers/vitest-runner.js +67 -0
  119. package/dist/helpers/vitest-runner.js.map +1 -0
  120. package/dist/http.d.ts +9 -0
  121. package/dist/http.d.ts.map +1 -0
  122. package/dist/http.js +49 -0
  123. package/dist/http.js.map +1 -0
  124. package/dist/index.d.ts +6 -0
  125. package/dist/index.d.ts.map +1 -0
  126. package/dist/index.js +5 -0
  127. package/dist/index.js.map +1 -0
  128. package/dist/runner.d.ts +4 -0
  129. package/dist/runner.d.ts.map +1 -0
  130. package/dist/runner.js +100 -0
  131. package/dist/runner.js.map +1 -0
  132. package/dist/types.d.ts +97 -0
  133. package/dist/types.d.ts.map +1 -0
  134. package/dist/types.js +2 -0
  135. package/dist/types.js.map +1 -0
  136. package/package.json +74 -0
@@ -0,0 +1,17 @@
1
+ import { registerCheck } from '../registry.js';
2
+ async function check(_ctx) {
3
+ return {
4
+ id: 'content-start-position',
5
+ category: 'page-size',
6
+ status: 'skip',
7
+ message: 'Not yet implemented',
8
+ };
9
+ }
10
+ registerCheck({
11
+ id: 'content-start-position',
12
+ category: 'page-size',
13
+ description: 'How far into content the actual documentation begins',
14
+ dependsOn: [],
15
+ run: check,
16
+ });
17
+ //# sourceMappingURL=content-start-position.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-start-position.js","sourceRoot":"","sources":["../../../src/checks/page-size/content-start-position.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,KAAK,UAAU,KAAK,CAAC,IAAkB;IACrC,OAAO;QACL,EAAE,EAAE,wBAAwB;QAC5B,QAAQ,EAAE,WAAW;QACrB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,qBAAqB;KAC/B,CAAC;AACJ,CAAC;AAED,aAAa,CAAC;IACZ,EAAE,EAAE,wBAAwB;IAC5B,QAAQ,EAAE,WAAW;IACrB,WAAW,EAAE,sDAAsD;IACnE,SAAS,EAAE,EAAE;IACb,GAAG,EAAE,KAAK;CACX,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=page-size-html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-size-html.d.ts","sourceRoot":"","sources":["../../../src/checks/page-size/page-size-html.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import { registerCheck } from '../registry.js';
2
+ async function check(_ctx) {
3
+ return {
4
+ id: 'page-size-html',
5
+ category: 'page-size',
6
+ status: 'skip',
7
+ message: 'Not yet implemented',
8
+ };
9
+ }
10
+ registerCheck({
11
+ id: 'page-size-html',
12
+ category: 'page-size',
13
+ description: 'Character count of HTML response and post-conversion size',
14
+ dependsOn: [],
15
+ run: check,
16
+ });
17
+ //# sourceMappingURL=page-size-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-size-html.js","sourceRoot":"","sources":["../../../src/checks/page-size/page-size-html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,KAAK,UAAU,KAAK,CAAC,IAAkB;IACrC,OAAO;QACL,EAAE,EAAE,gBAAgB;QACpB,QAAQ,EAAE,WAAW;QACrB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,qBAAqB;KAC/B,CAAC;AACJ,CAAC;AAED,aAAa,CAAC;IACZ,EAAE,EAAE,gBAAgB;IACpB,QAAQ,EAAE,WAAW;IACrB,WAAW,EAAE,2DAA2D;IACxE,SAAS,EAAE,EAAE;IACb,GAAG,EAAE,KAAK;CACX,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=page-size-markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-size-markdown.d.ts","sourceRoot":"","sources":["../../../src/checks/page-size/page-size-markdown.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import { registerCheck } from '../registry.js';
2
+ async function check(_ctx) {
3
+ return {
4
+ id: 'page-size-markdown',
5
+ category: 'page-size',
6
+ status: 'skip',
7
+ message: 'Not yet implemented',
8
+ };
9
+ }
10
+ registerCheck({
11
+ id: 'page-size-markdown',
12
+ category: 'page-size',
13
+ description: 'Character count of page when served as markdown',
14
+ dependsOn: [['markdown-url-support', 'content-negotiation']],
15
+ run: check,
16
+ });
17
+ //# sourceMappingURL=page-size-markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-size-markdown.js","sourceRoot":"","sources":["../../../src/checks/page-size/page-size-markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,KAAK,UAAU,KAAK,CAAC,IAAkB;IACrC,OAAO;QACL,EAAE,EAAE,oBAAoB;QACxB,QAAQ,EAAE,WAAW;QACrB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,qBAAqB;KAC/B,CAAC;AACJ,CAAC;AAED,aAAa,CAAC;IACZ,EAAE,EAAE,oBAAoB;IACxB,QAAQ,EAAE,WAAW;IACrB,WAAW,EAAE,iDAAiD;IAC9D,SAAS,EAAE,CAAC,CAAC,sBAAsB,EAAE,qBAAqB,CAAC,CAAC;IAC5D,GAAG,EAAE,KAAK;CACX,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { CheckDefinition } from '../types.js';
2
+ export declare function registerCheck(def: CheckDefinition): void;
3
+ export declare function getCheck(id: string): CheckDefinition | undefined;
4
+ export declare function getAllChecks(): CheckDefinition[];
5
+ /** Returns checks sorted by category order, preserving registration order within category. */
6
+ export declare function getChecksSorted(): CheckDefinition[];
7
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/checks/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAKnD,wBAAgB,aAAa,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAExD;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAEhE;AAED,wBAAgB,YAAY,IAAI,eAAe,EAAE,CAEhD;AAED,8FAA8F;AAC9F,wBAAgB,eAAe,IAAI,eAAe,EAAE,CAMnD"}
@@ -0,0 +1,20 @@
1
+ import { CATEGORY_ORDER } from '../constants.js';
2
+ const registry = new Map();
3
+ export function registerCheck(def) {
4
+ registry.set(def.id, def);
5
+ }
6
+ export function getCheck(id) {
7
+ return registry.get(id);
8
+ }
9
+ export function getAllChecks() {
10
+ return Array.from(registry.values());
11
+ }
12
+ /** Returns checks sorted by category order, preserving registration order within category. */
13
+ export function getChecksSorted() {
14
+ return getAllChecks().sort((a, b) => {
15
+ const orderA = CATEGORY_ORDER[a.category] ?? 99;
16
+ const orderB = CATEGORY_ORDER[b.category] ?? 99;
17
+ return orderA - orderB;
18
+ });
19
+ }
20
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/checks/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,QAAQ,GAAiC,IAAI,GAAG,EAAE,CAAC;AAEzD,MAAM,UAAU,aAAa,CAAC,GAAoB;IAChD,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAU;IACjC,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAClC,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChD,OAAO,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=http-status-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-status-codes.d.ts","sourceRoot":"","sources":["../../../src/checks/url-stability/http-status-codes.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import { registerCheck } from '../registry.js';
2
+ async function check(_ctx) {
3
+ return {
4
+ id: 'http-status-codes',
5
+ category: 'url-stability',
6
+ status: 'skip',
7
+ message: 'Not yet implemented',
8
+ };
9
+ }
10
+ registerCheck({
11
+ id: 'http-status-codes',
12
+ category: 'url-stability',
13
+ description: 'Whether error pages return correct HTTP status codes',
14
+ dependsOn: [],
15
+ run: check,
16
+ });
17
+ //# sourceMappingURL=http-status-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-status-codes.js","sourceRoot":"","sources":["../../../src/checks/url-stability/http-status-codes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,KAAK,UAAU,KAAK,CAAC,IAAkB;IACrC,OAAO;QACL,EAAE,EAAE,mBAAmB;QACvB,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,qBAAqB;KAC/B,CAAC;AACJ,CAAC;AAED,aAAa,CAAC;IACZ,EAAE,EAAE,mBAAmB;IACvB,QAAQ,EAAE,eAAe;IACzB,WAAW,EAAE,sDAAsD;IACnE,SAAS,EAAE,EAAE;IACb,GAAG,EAAE,KAAK;CACX,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=redirect-behavior.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirect-behavior.d.ts","sourceRoot":"","sources":["../../../src/checks/url-stability/redirect-behavior.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import { registerCheck } from '../registry.js';
2
+ async function check(_ctx) {
3
+ return {
4
+ id: 'redirect-behavior',
5
+ category: 'url-stability',
6
+ status: 'skip',
7
+ message: 'Not yet implemented',
8
+ };
9
+ }
10
+ registerCheck({
11
+ id: 'redirect-behavior',
12
+ category: 'url-stability',
13
+ description: 'Whether redirects are same-host HTTP redirects',
14
+ dependsOn: [],
15
+ run: check,
16
+ });
17
+ //# sourceMappingURL=redirect-behavior.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirect-behavior.js","sourceRoot":"","sources":["../../../src/checks/url-stability/redirect-behavior.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,KAAK,UAAU,KAAK,CAAC,IAAkB;IACrC,OAAO;QACL,EAAE,EAAE,mBAAmB;QACvB,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,qBAAqB;KAC/B,CAAC;AACJ,CAAC;AAED,aAAa,CAAC;IACZ,EAAE,EAAE,mBAAmB;IACvB,QAAQ,EAAE,eAAe;IACzB,WAAW,EAAE,gDAAgD;IAC7D,SAAS,EAAE,EAAE;IACb,GAAG,EAAE,KAAK;CACX,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from 'commander';
2
+ import '../../checks/index.js';
3
+ export declare function registerCheckCommand(program: Command): void;
4
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,OAAO,uBAAuB,CAAC;AAE/B,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkC3D"}
@@ -0,0 +1,38 @@
1
+ import { runChecks } from '../../runner.js';
2
+ import { formatText } from '../formatters/text.js';
3
+ import { formatJson } from '../formatters/json.js';
4
+ // Ensure all checks are registered
5
+ import '../../checks/index.js';
6
+ export function registerCheckCommand(program) {
7
+ program
8
+ .command('check <url>')
9
+ .description('Run agent-friendly documentation checks against a URL')
10
+ .option('-f, --format <format>', 'Output format: text or json', 'text')
11
+ .option('-c, --checks <checks>', 'Comma-separated list of check IDs to run')
12
+ .option('--max-concurrency <n>', 'Maximum concurrent requests', '3')
13
+ .option('--request-delay <ms>', 'Delay between requests in ms', '200')
14
+ .option('--max-links <n>', 'Maximum links to test', '50')
15
+ .option('--pass-threshold <n>', 'Pass threshold in characters', '50000')
16
+ .option('--fail-threshold <n>', 'Fail threshold in characters', '100000')
17
+ .action(async (url, opts) => {
18
+ const checkIds = opts.checks ? opts.checks.split(',').map((s) => s.trim()) : undefined;
19
+ const report = await runChecks(url, {
20
+ checkIds,
21
+ maxConcurrency: parseInt(opts.maxConcurrency, 10),
22
+ requestDelay: parseInt(opts.requestDelay, 10),
23
+ maxLinksToTest: parseInt(opts.maxLinks, 10),
24
+ thresholds: {
25
+ pass: parseInt(opts.passThreshold, 10),
26
+ fail: parseInt(opts.failThreshold, 10),
27
+ },
28
+ });
29
+ const output = opts.format === 'json' ? formatJson(report) : formatText(report);
30
+ process.stdout.write(output + '\n');
31
+ // Exit 1 if any check failed
32
+ const hasFailure = report.results.some((r) => r.status === 'fail');
33
+ if (hasFailure) {
34
+ process.exitCode = 1;
35
+ }
36
+ });
37
+ }
38
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,mCAAmC;AACnC,OAAO,uBAAuB,CAAC;AAE/B,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,CAAC;SACtE,MAAM,CAAC,uBAAuB,EAAE,0CAA0C,CAAC;SAC3E,MAAM,CAAC,uBAAuB,EAAE,6BAA6B,EAAE,GAAG,CAAC;SACnE,MAAM,CAAC,sBAAsB,EAAE,8BAA8B,EAAE,KAAK,CAAC;SACrE,MAAM,CAAC,iBAAiB,EAAE,uBAAuB,EAAE,IAAI,CAAC;SACxD,MAAM,CAAC,sBAAsB,EAAE,8BAA8B,EAAE,OAAO,CAAC;SACvE,MAAM,CAAC,sBAAsB,EAAE,8BAA8B,EAAE,QAAQ,CAAC;SACxE,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,IAA4B,EAAE,EAAE;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEvF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;YAClC,QAAQ;YACR,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YACjD,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YAC7C,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC3C,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;gBACtC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;aACvC;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAChF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QAEpC,6BAA6B;QAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACnE,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ReportResult } from '../../types.js';
2
+ export declare function formatJson(report: ReportResult): string;
3
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../src/cli/formatters/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAEvD"}
@@ -0,0 +1,4 @@
1
+ export function formatJson(report) {
2
+ return JSON.stringify(report, null, 2);
3
+ }
4
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/cli/formatters/json.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,UAAU,CAAC,MAAoB;IAC7C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ReportResult } from '../../types.js';
2
+ export declare function formatText(report: ReportResult): string;
3
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/cli/formatters/text.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,gBAAgB,CAAC;AAwBhE,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAqCvD"}
@@ -0,0 +1,59 @@
1
+ import chalk from 'chalk';
2
+ const STATUS_ICONS = {
3
+ pass: chalk.green('✓'),
4
+ warn: chalk.yellow('⚠'),
5
+ fail: chalk.red('✗'),
6
+ skip: chalk.gray('○'),
7
+ error: chalk.red('!'),
8
+ };
9
+ const STATUS_COLORS = {
10
+ pass: chalk.green,
11
+ warn: chalk.yellow,
12
+ fail: chalk.red,
13
+ skip: chalk.gray,
14
+ error: chalk.red,
15
+ };
16
+ function formatResult(result) {
17
+ const icon = STATUS_ICONS[result.status] ?? '?';
18
+ const color = STATUS_COLORS[result.status] ?? ((s) => s);
19
+ return ` ${icon} ${color(result.id)}: ${result.message}`;
20
+ }
21
+ export function formatText(report) {
22
+ const lines = [];
23
+ lines.push('');
24
+ lines.push(chalk.bold(`Agent-Friendly Docs Check: ${report.url}`));
25
+ lines.push(chalk.gray(`Timestamp: ${report.timestamp}`));
26
+ lines.push('');
27
+ // Group by category
28
+ const byCategory = new Map();
29
+ for (const result of report.results) {
30
+ const existing = byCategory.get(result.category) ?? [];
31
+ existing.push(result);
32
+ byCategory.set(result.category, existing);
33
+ }
34
+ for (const [category, results] of byCategory) {
35
+ lines.push(chalk.bold.underline(category));
36
+ for (const result of results) {
37
+ lines.push(formatResult(result));
38
+ }
39
+ lines.push('');
40
+ }
41
+ // Summary
42
+ lines.push(chalk.bold('Summary'));
43
+ const { summary } = report;
44
+ const parts = [];
45
+ if (summary.pass > 0)
46
+ parts.push(chalk.green(`${summary.pass} passed`));
47
+ if (summary.warn > 0)
48
+ parts.push(chalk.yellow(`${summary.warn} warnings`));
49
+ if (summary.fail > 0)
50
+ parts.push(chalk.red(`${summary.fail} failed`));
51
+ if (summary.skip > 0)
52
+ parts.push(chalk.gray(`${summary.skip} skipped`));
53
+ if (summary.error > 0)
54
+ parts.push(chalk.red(`${summary.error} errors`));
55
+ lines.push(` ${parts.join(', ')} (${summary.total} total)`);
56
+ lines.push('');
57
+ return lines.join('\n');
58
+ }
59
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/cli/formatters/text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function run(argv: string[]): void;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAGA,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAWxC"}
@@ -0,0 +1,12 @@
1
+ import { Command } from 'commander';
2
+ import { registerCheckCommand } from './commands/check.js';
3
+ export function run(argv) {
4
+ const program = new Command();
5
+ program
6
+ .name('afdocs')
7
+ .description('Test your documentation site against the Agent-Friendly Documentation Spec')
8
+ .version('0.1.0');
9
+ registerCheckCommand(program);
10
+ program.parse(argv);
11
+ }
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,UAAU,GAAG,CAAC,IAAc;IAChC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CAAC,4EAA4E,CAAC;SACzF,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAE9B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { CheckOptions, SizeThresholds } from './types.js';
2
+ export declare const DEFAULT_THRESHOLDS: SizeThresholds;
3
+ export declare const DEFAULT_OPTIONS: CheckOptions;
4
+ export declare const CATEGORIES: readonly [{
5
+ readonly id: "llms-txt";
6
+ readonly name: "llms.txt";
7
+ readonly order: 1;
8
+ }, {
9
+ readonly id: "markdown-availability";
10
+ readonly name: "Markdown Availability";
11
+ readonly order: 2;
12
+ }, {
13
+ readonly id: "page-size";
14
+ readonly name: "Page Size and Truncation Risk";
15
+ readonly order: 3;
16
+ }, {
17
+ readonly id: "content-structure";
18
+ readonly name: "Content Structure";
19
+ readonly order: 4;
20
+ }, {
21
+ readonly id: "url-stability";
22
+ readonly name: "URL Stability and Redirects";
23
+ readonly order: 5;
24
+ }, {
25
+ readonly id: "agent-discoverability";
26
+ readonly name: "Agent Discoverability Directives";
27
+ readonly order: 6;
28
+ }, {
29
+ readonly id: "observability";
30
+ readonly name: "Observability and Content Health";
31
+ readonly order: 7;
32
+ }];
33
+ export declare const CATEGORY_ORDER: Record<string, number>;
34
+ /** Link resolution threshold: warn if > 90% resolve, fail if <= 90%. */
35
+ export declare const LINK_RESOLVE_THRESHOLD = 0.9;
36
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/D,eAAO,MAAM,kBAAkB,EAAE,cAGhC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,YAM7B,CAAC;AAEF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQb,CAAC;AAEX,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAEjD,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,sBAAsB,MAAM,CAAC"}
@@ -0,0 +1,24 @@
1
+ export const DEFAULT_THRESHOLDS = {
2
+ pass: 50_000,
3
+ fail: 100_000,
4
+ };
5
+ export const DEFAULT_OPTIONS = {
6
+ maxConcurrency: 3,
7
+ requestDelay: 200,
8
+ requestTimeout: 15_000,
9
+ maxLinksToTest: 50,
10
+ thresholds: DEFAULT_THRESHOLDS,
11
+ };
12
+ export const CATEGORIES = [
13
+ { id: 'llms-txt', name: 'llms.txt', order: 1 },
14
+ { id: 'markdown-availability', name: 'Markdown Availability', order: 2 },
15
+ { id: 'page-size', name: 'Page Size and Truncation Risk', order: 3 },
16
+ { id: 'content-structure', name: 'Content Structure', order: 4 },
17
+ { id: 'url-stability', name: 'URL Stability and Redirects', order: 5 },
18
+ { id: 'agent-discoverability', name: 'Agent Discoverability Directives', order: 6 },
19
+ { id: 'observability', name: 'Observability and Content Health', order: 7 },
20
+ ];
21
+ export const CATEGORY_ORDER = Object.fromEntries(CATEGORIES.map((c) => [c.id, c.order]));
22
+ /** Link resolution threshold: warn if > 90% resolve, fail if <= 90%. */
23
+ export const LINK_RESOLVE_THRESHOLD = 0.9;
24
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAmB;IAChD,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,OAAO;CACd,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAiB;IAC3C,cAAc,EAAE,CAAC;IACjB,YAAY,EAAE,GAAG;IACjB,cAAc,EAAE,MAAM;IACtB,cAAc,EAAE,EAAE;IAClB,UAAU,EAAE,kBAAkB;CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE;IAC9C,EAAE,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC,EAAE;IACxE,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,+BAA+B,EAAE,KAAK,EAAE,CAAC,EAAE;IACpE,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE;IAChE,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,6BAA6B,EAAE,KAAK,EAAE,CAAC,EAAE;IACtE,EAAE,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,kCAAkC,EAAE,KAAK,EAAE,CAAC,EAAE;IACnF,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,kCAAkC,EAAE,KAAK,EAAE,CAAC,EAAE;CACnE,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAA2B,MAAM,CAAC,WAAW,CACtE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CACvC,CAAC;AAEF,wEAAwE;AACxE,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AgentDocsConfig } from '../types.js';
2
+ export declare function loadConfig(dir?: string): Promise<AgentDocsConfig>;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/helpers/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAInD,wBAAsB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAqBvE"}
@@ -0,0 +1,25 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { resolve } from 'node:path';
3
+ import { parse as parseYaml } from 'yaml';
4
+ const CONFIG_FILENAMES = ['agent-docs.config.yml', 'agent-docs.config.yaml'];
5
+ export async function loadConfig(dir) {
6
+ const searchDir = dir ?? process.cwd();
7
+ for (const filename of CONFIG_FILENAMES) {
8
+ const filepath = resolve(searchDir, filename);
9
+ try {
10
+ const content = await readFile(filepath, 'utf-8');
11
+ const parsed = parseYaml(content);
12
+ if (!parsed.url) {
13
+ throw new Error(`Config file ${filepath} is missing required "url" field`);
14
+ }
15
+ return parsed;
16
+ }
17
+ catch (err) {
18
+ if (err.code === 'ENOENT')
19
+ continue;
20
+ throw err;
21
+ }
22
+ }
23
+ throw new Error(`No agent-docs config file found. Create ${CONFIG_FILENAMES[0]} with at least a "url" field.`);
24
+ }
25
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/helpers/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAG1C,MAAM,gBAAgB,GAAG,CAAC,uBAAuB,EAAE,wBAAwB,CAAC,CAAC;AAE7E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAY;IAC3C,MAAM,SAAS,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEvC,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAoB,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,eAAe,QAAQ,kCAAkC,CAAC,CAAC;YAC7E,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YAC/D,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,2CAA2C,gBAAgB,CAAC,CAAC,CAAC,+BAA+B,CAC9F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { loadConfig } from './config.js';
2
+ export { describeAgentDocs, describeAgentDocsPerCheck } from './vitest-runner.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { loadConfig } from './config.js';
2
+ export { describeAgentDocs, describeAgentDocsPerCheck } from './vitest-runner.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { AgentDocsConfig } from '../types.js';
2
+ import '../checks/index.js';
3
+ /**
4
+ * Auto-generates vitest tests from an agent-docs config file.
5
+ *
6
+ * Usage in a test file:
7
+ * ```ts
8
+ * import { describeAgentDocs } from 'agent-docs-testing/helpers';
9
+ * describeAgentDocs();
10
+ * ```
11
+ */
12
+ export declare function describeAgentDocs(configOrDir?: AgentDocsConfig | string): void;
13
+ /**
14
+ * Auto-generates individual vitest tests per check from an agent-docs config.
15
+ *
16
+ * Usage:
17
+ * ```ts
18
+ * import { describeAgentDocsPerCheck } from 'agent-docs-testing/helpers';
19
+ * describeAgentDocsPerCheck();
20
+ * ```
21
+ */
22
+ export declare function describeAgentDocsPerCheck(configOrDir?: AgentDocsConfig | string): void;
23
+ //# sourceMappingURL=vitest-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest-runner.d.ts","sourceRoot":"","sources":["../../src/helpers/vitest-runner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,aAAa,CAAC;AAGhE,OAAO,oBAAoB,CAAC;AAE5B;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,CAAC,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CA0B9E;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,CAAC,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAuBtF"}
@@ -0,0 +1,67 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { runChecks } from '../runner.js';
3
+ import { loadConfig } from './config.js';
4
+ // Ensure all checks are registered
5
+ import '../checks/index.js';
6
+ /**
7
+ * Auto-generates vitest tests from an agent-docs config file.
8
+ *
9
+ * Usage in a test file:
10
+ * ```ts
11
+ * import { describeAgentDocs } from 'agent-docs-testing/helpers';
12
+ * describeAgentDocs();
13
+ * ```
14
+ */
15
+ export function describeAgentDocs(configOrDir) {
16
+ describe('Agent-Friendly Documentation', () => {
17
+ let results;
18
+ it('should run checks', async () => {
19
+ const config = typeof configOrDir === 'object'
20
+ ? configOrDir
21
+ : await loadConfig(typeof configOrDir === 'string' ? configOrDir : undefined);
22
+ const report = await runChecks(config.url, {
23
+ checkIds: config.checks,
24
+ ...config.options,
25
+ });
26
+ results = report.results;
27
+ });
28
+ it('should have no failing checks', () => {
29
+ expect(results).toBeDefined();
30
+ const failures = results.filter((r) => r.status === 'fail');
31
+ if (failures.length > 0) {
32
+ const messages = failures.map((f) => `${f.id}: ${f.message}`).join('\n');
33
+ expect.fail(`${failures.length} check(s) failed:\n${messages}`);
34
+ }
35
+ });
36
+ });
37
+ }
38
+ /**
39
+ * Auto-generates individual vitest tests per check from an agent-docs config.
40
+ *
41
+ * Usage:
42
+ * ```ts
43
+ * import { describeAgentDocsPerCheck } from 'agent-docs-testing/helpers';
44
+ * describeAgentDocsPerCheck();
45
+ * ```
46
+ */
47
+ export function describeAgentDocsPerCheck(configOrDir) {
48
+ describe('Agent-Friendly Documentation', () => {
49
+ let _results;
50
+ // Run all checks once, then assert per-check
51
+ it('should run checks', async () => {
52
+ const config = typeof configOrDir === 'object'
53
+ ? configOrDir
54
+ : await loadConfig(typeof configOrDir === 'string' ? configOrDir : undefined);
55
+ const report = await runChecks(config.url, {
56
+ checkIds: config.checks,
57
+ ...config.options,
58
+ });
59
+ _results = new Map(report.results.map((r) => [r.id, r]));
60
+ });
61
+ // Individual check assertions will be generated after the setup test runs.
62
+ // Since vitest doesn't support dynamic test generation after suite setup,
63
+ // users should use describeAgentDocs() for the simple case or import
64
+ // checks individually for per-check control.
65
+ });
66
+ }
67
+ //# sourceMappingURL=vitest-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest-runner.js","sourceRoot":"","sources":["../../src/helpers/vitest-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,mCAAmC;AACnC,OAAO,oBAAoB,CAAC;AAE5B;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAsC;IACtE,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;QAC5C,IAAI,OAAsB,CAAC;QAE3B,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;YACjC,MAAM,MAAM,GACV,OAAO,WAAW,KAAK,QAAQ;gBAC7B,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAElF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE;gBACzC,QAAQ,EAAE,MAAM,CAAC,MAAM;gBACvB,GAAG,MAAM,CAAC,OAAO;aAClB,CAAC,CAAC;YACH,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;YAC5D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzE,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,sBAAsB,QAAQ,EAAE,CAAC,CAAC;YAClE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CAAC,WAAsC;IAC9E,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;QAC5C,IAAI,QAAkC,CAAC;QAEvC,6CAA6C;QAC7C,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;YACjC,MAAM,MAAM,GACV,OAAO,WAAW,KAAK,QAAQ;gBAC7B,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAElF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE;gBACzC,QAAQ,EAAE,MAAM,CAAC,MAAM;gBACvB,GAAG,MAAM,CAAC,OAAO;aAClB,CAAC,CAAC;YACH,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,2EAA2E;QAC3E,0EAA0E;QAC1E,qEAAqE;QACrE,6CAA6C;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import type { HttpClient } from './types.js';
2
+ interface RateLimitedHttpClientOptions {
3
+ requestDelay: number;
4
+ requestTimeout: number;
5
+ maxConcurrency: number;
6
+ }
7
+ export declare function createHttpClient(options: RateLimitedHttpClientOptions): HttpClient;
8
+ export {};
9
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAoC,MAAM,YAAY,CAAC;AAE/E,UAAU,4BAA4B;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,4BAA4B,GAAG,UAAU,CAsDlF"}