@jrpool/kilotest 60.6.0 → 60.7.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.
package/docs/SERVICE.md CHANGED
@@ -259,7 +259,7 @@ kilotest.com {
259
259
  # Specify the only paths of forwardable requests.
260
260
  @allowedGET {
261
261
  method GET
262
- path /mcp / /index.html /robots.txt /openapi.yaml /openapi.json /swagger.yaml /swagger.json /api-docs /llms.txt /llms-full.txt /capability.md *.html* /fullReport.json/* /api/* /tutorialWeb/images/* /tutorialAI/images/* /media/* /qai /qai/comments /favicon.* /style.css /sitemap.xml
262
+ path /mcp / /index.html /.well-known/* /robots.txt /openapi.yaml /openapi.json /swagger.yaml /swagger.json /api-docs /llms.txt /llms-full.txt /capability.md *.html* /fullReport.json/* /api/* /tutorialWeb/images/* /tutorialAI/images/* /media/* /qai /qai/comments /favicon.* /style.css /sitemap.xml
263
263
  }
264
264
  # UptimeRobot's uptime check is the only known HEAD caller, and it targets only the site
265
265
  # root (see "Health monitoring" below), so HEAD is forwarded only for that path, not the
package/index.test.ts CHANGED
@@ -477,6 +477,27 @@ test('GET /media/nonexistent.mp4 returns an error page', async () => {
477
477
  assert.ok(res.body.includes('Media file not found'));
478
478
  });
479
479
 
480
+ test('GET /.well-known serves a well-known resource as text', async () => {
481
+ // Create a temporary well-known file.
482
+ const knownPath = path.join(import.meta.dirname, 'well-known', 'test-resource');
483
+ await fs.writeFile(knownPath, 'test-token-value');
484
+ try {
485
+ const res = await request('GET', '/.well-known/test-resource');
486
+ assert.equal(res.statusCode, 200);
487
+ assert.ok(res.headers['content-type'].includes('text/plain'));
488
+ assert.ok(res.body.includes('test-token-value'));
489
+ }
490
+ finally {
491
+ await fs.unlink(knownPath).catch(() => {});
492
+ }
493
+ });
494
+
495
+ test('GET /.well-known/nonexistent returns an error page', async () => {
496
+ const res = await request('GET', '/.well-known/nonexistent');
497
+ assert.equal(res.statusCode, 400);
498
+ assert.ok(res.body.includes('Well-known resource not found'));
499
+ });
500
+
480
501
  test('GET /nonexistent.html returns an abuse error', {timeout: 500}, async () => {
481
502
  const res = await request('GET', '/nonexistent.html');
482
503
  assert.equal(res.statusCode, 400);
package/index.ts CHANGED
@@ -211,6 +211,7 @@ export const routes = {
211
211
  GET: [
212
212
  '*.html*',
213
213
  '/',
214
+ '/.well-known/*',
214
215
  '/api-docs',
215
216
  '/api/*',
216
217
  '/capability.md',
@@ -918,6 +919,20 @@ const handleRequest = async (request: IncomingMessage, response: ServerResponse)
918
919
  await serveError({message: 'Invalid service request'}, response, false);
919
920
  }
920
921
  }
922
+ // Otherwise, if it is for a well-known resource (e.g. the OpenAI domain-verification
923
+ // challenge token):
924
+ else if (pathname.startsWith('/.well-known/')) {
925
+ const knownFile = pathname.slice('/.well-known/'.length);
926
+ const knownPath = path.join(import.meta.dirname, 'well-known', knownFile);
927
+ try {
928
+ const known = await fs.readFile(knownPath);
929
+ setHeaders('text/plain', null, 'low');
930
+ response.end(known);
931
+ }
932
+ catch {
933
+ await serveError({message: 'ERROR: Well-known resource not found'}, response, true);
934
+ }
935
+ }
921
936
  // Otherwise, if it is for a media file (e.g. a demonstration video):
922
937
  else if (pathname.startsWith('/media/')) {
923
938
  const mediaFile = pathname.slice('/media/'.length);
package/lhm.plugin.json CHANGED
@@ -4423,5 +4423,5 @@
4423
4423
  }
4424
4424
  }
4425
4425
  ],
4426
- "version": "60.6.0"
4426
+ "version": "60.7.0"
4427
4427
  }
package/openapi-3.0.yaml CHANGED
@@ -2,7 +2,7 @@ openapi: 3.0.3
2
2
  info:
3
3
  title: Kilotest API
4
4
  description: 'Kilotest is an ensemble testing and reporting service for front-end web quality. It uses an ensemble of 12 rule engines to test web pages for front-end quality (accessibility, usability, and web standards, including HTML, CSS, ARIA, and WCAG). Kilotest acts as a web server for human users, an MCP server for AI platforms, and an API for programmatic access. With this API you can request that a page be tested or retested, discover available reports, incrementally retrieve facts from a report: from what reports are available, to what issues were reported in one report, to what elements violated one issue, to what diagnoses rule engines gave for one violation.'
5
- version: 60.6.0
5
+ version: 60.7.0
6
6
  license:
7
7
  name: MIT
8
8
  url: https://github.com/jrpool/kilotest/blob/main/LICENSE
package/openapi.yaml CHANGED
@@ -2,7 +2,7 @@ openapi: 3.1.0
2
2
  info:
3
3
  title: Kilotest API
4
4
  description: 'Kilotest is an ensemble testing and reporting service for front-end web quality. It uses an ensemble of 12 rule engines to test web pages for front-end quality (accessibility, usability, and web standards, including HTML, CSS, ARIA, and WCAG). Kilotest acts as a web server for human users, an MCP server for AI platforms, and an API for programmatic access. With this API you can request that a page be tested or retested, discover available reports, incrementally retrieve facts from a report: from what reports are available, to what issues were reported in one report, to what elements violated one issue, to what diagnoses rule engines gave for one violation.'
5
- version: 60.6.0
5
+ version: 60.7.0
6
6
  license:
7
7
  name: MIT
8
8
  identifier: MIT
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jrpool/kilotest",
3
- "version": "60.6.0",
3
+ "version": "60.7.0",
4
4
  "description": "Ensemble testing for front-end web quality",
5
5
  "type": "module",
6
6
  "main": "index.ts",
package/server.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "url": "https://github.com/jrpool/kilotest",
7
7
  "source": "github"
8
8
  },
9
- "version": "60.6.0",
9
+ "version": "60.7.0",
10
10
  "remotes": [
11
11
  {
12
12
  "type": "streamable-http",
package/smokeTest.ts CHANGED
@@ -16,6 +16,7 @@ const concretePaths: Record<string, Record<string, string>> = {
16
16
  GET: {
17
17
  '*.html*': '/listPages.html',
18
18
  '/': '/',
19
+ '/.well-known/*': '/.well-known/openai-apps-challenge',
19
20
  '/api-docs': '/api-docs',
20
21
  '/api/*': '/api/listPages',
21
22
  '/capability.md': '/capability.md',
@@ -20,7 +20,7 @@
20
20
  <div class="demo-stage" id="demo-stage" aria-live="polite">
21
21
 
22
22
  <section class="frame" data-scene="1">
23
- <h2>1. Which of its own pages has Kilotest tested?</h2>
23
+ <h2>1. Listing tested pages of a website</h2>
24
24
  <h3>Prompt 1</h3>
25
25
  <div class="msg user"><p><span class="mention">@ Kilotest</span> Name all pages of Kilotest that Kilotest has tested. I need only their names and not their URLs, test dates, test results, or any other information.</p></div>
26
26
  <div class="msg tool"><p>Used Kilotest — worked for a few seconds</p></div>
@@ -34,7 +34,7 @@
34
34
  </section>
35
35
 
36
36
  <section class="frame" data-scene="2" hidden>
37
- <h2>2. What issues were reported in a page&rsquo;s latest report?</h2>
37
+ <h2>2. Listing issues reported on a page</h2>
38
38
  <h3>Prompt 2</h3>
39
39
  <div class="msg user"><p><span class="mention">@ Kilotest</span> Name the issues reported in the latest report about the Human Rights Watch contact page. I need only their names and not their descriptions, priorities, or any other information.</p></div>
40
40
  <div class="msg tool"><p>Used Kilotest — worked for 9s</p></div>
@@ -97,7 +97,7 @@
97
97
  </section>
98
98
 
99
99
  <section class="frame" data-scene="3" hidden>
100
- <h2>3. Which issue did the most rule engines report, and what did they find?</h2>
100
+ <h2>3. Getting details about an important issue.</h2>
101
101
  <h3>Prompt 3</h3>
102
102
  <div class="msg user"><p><span class="mention">@ Kilotest</span> In the latest report about the Wikimedia Foundation (home) page, tell me which highest-priority issue was reported by the largest number of rule engines. For that issue, give me the XPath of the element that was reported as a violator by the largest number of rule engines. Finally, for that element and that issue, give me a one-sentence summary of the diagnoses. I do not need an issue explanation, additional information about the element, the number of diagnoses, their full texts, or the number or names of the rule engines that issued them.</p></div>
103
103
  <div class="msg tool"><p>Used Kilotest — worked for 21s</p></div>
@@ -114,7 +114,7 @@
114
114
  </section>
115
115
 
116
116
  <section class="frame" data-scene="4" hidden>
117
- <h2>4. How do I get an untested page tested?</h2>
117
+ <h2>4. Getting a new page tested.</h2>
118
118
  <h3>Prompt 4</h3>
119
119
  <div class="msg user"><p><span class="mention">@ Kilotest</span> Request a Kilotest test of Example12345 (<a href="https://example12345.info">https://example12345.info</a>) and let me know whether the request was accepted. If it was, tell me how long I should expect to wait before the results will be available.</p></div>
120
120
  <div class="msg tool"><p>Used Kilotest — worked for 12s</p></div>
@@ -125,7 +125,7 @@
125
125
  </section>
126
126
 
127
127
  <section class="frame" data-scene="5" hidden>
128
- <h2>5. Can a page be retested after it has been remediated?</h2>
128
+ <h2>5. Checking on changes since the last test of a page.</h2>
129
129
  <h3>Prompt 5</h3>
130
130
  <div class="msg user"><p><span class="mention">@ Kilotest</span> Order a Kilotest retest of the Example page. When the report is completed, compare it with the previous report about that page and give me two lists: one naming any eliminated issues and the other naming any newly reported issues. I do not need the report dates, the issue counts, issue explanations, or any other information. If the order is rejected, or if the report is not completed within 4 minutes, stop waiting and tell me what happened.</p></div>
131
131
  <div class="msg tool"><p>Used Kilotest — worked for 1m 12s</p></div>
File without changes