@jrpool/kilotest 60.6.0 → 60.7.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/docs/AI-TOOLS.md CHANGED
@@ -42,6 +42,7 @@ The external features that support the use of Kilotest as a collection of AI too
42
42
  - A [pull request](https://github.com/public-apis/public-apis/pull/6346/changes) to add Kilotest to the list of public APIs in the `public-apis` repository.
43
43
  - An [issue](https://github.com/APIs-guru/openapi-directory/issues/2677) to add Kilotest to `openapi-directory`.
44
44
  - A [pull request](https://github.com/w3c/wai-evaluation-tools-list/pull/1153) to add Kilotest to the WAI evaluation tools list.
45
+ - An in-progress, incomplete submission of Kilotest as a plugin to OpenAI, under the organization name Kilotest, with organization ID `org-HOt5F01qJGQcl6V0sHj9HWr3`. Submission awaits correction of a defect that prevents submitters from recording their ID cards for identity verification. Upon that correction, the archive `kilotest-overview.zip` in this `docs` directory will be uploaded to OpenAI; a challenge token received from OpenAI will be stored in the `well-known` directory; the OpenAI “Scan Tools” function will be performed; and its requirement for 3 justifications per tool will be satisfied. Example for listDiagnoses: readOnlyHint: true — "The tool only retrieves stored report data; it modifies nothing." openWorldHint: false — "It reads only Kilotest's own database of reports; users can select among stored results but cannot direct it to arbitrary external resources." destructiveHint: false — "It deletes or overwrites nothing."
45
46
  - Registration of Kilotest as an active server in the [official MCP Registry](https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.jrpool/kilotest), maintained by the [Model Context Protocol](https://modelcontextprotocol.io/) project. The [PulseMCP](https://www.pulsemcp.com/servers) directory and the VS Code MCP gallery both crawl this registry, so Kilotest is discoverable through them with no separate submission.
46
47
  - Registration of Kilotest with the [Smithery](https://smithery.ai/servers/pool/kilotest) MCP server registry.
47
48
  - Registration of Kilotest with the [Glama](https://glama.ai/mcp/connectors/com.kilotest/kilotest) MCP server registry, including a claim of ownership of the MCP connector by the maintainer via a `TXT` DNS record for `_glama-claim.kilotest.com`, with the value `glama_claim_gVV4HrPdcXr9TEfj1p3icEUBJ3_OVJGX`.
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
Binary file
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.1"
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.1
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.1
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.1",
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.1",
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