@jrpool/kilotest 60.0.6 → 60.0.8
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 +33 -0
- package/docs/AI-TOOLS.md +2 -27
- package/lhm.plugin.json +1 -1
- package/openapi-3.0.yaml +1 -1
- package/openapi.yaml +1 -1
- package/package.json +1 -1
- package/scripts/postPR.ts +2 -1
- package/server.json +1 -1
- package/style.css +9 -9
- package/web/listIssues/index.ts +4 -4
package/README.md
CHANGED
|
@@ -65,3 +65,36 @@ There is additional documentation at:
|
|
|
65
65
|
- [llms.txt](llms.txt): basic documentation for LLMs
|
|
66
66
|
- [llms-full.txt](llms-full.txt): comprehensive documentation for LLMs
|
|
67
67
|
- [lhm.plugin.json](lhm.plugin.json): documentation for registration with the LobeHub MCP Market
|
|
68
|
+
|
|
69
|
+
## Maintenance
|
|
70
|
+
|
|
71
|
+
These are the routine steps for maintaining Kilotest as currently deployed.
|
|
72
|
+
|
|
73
|
+
### No API changes
|
|
74
|
+
|
|
75
|
+
When you make a change in a feature branch **without** any API or tool contract change:
|
|
76
|
+
|
|
77
|
+
1. Stage, commit, and optionally push all changes.
|
|
78
|
+
2. Execute `npm run prePR -- <level>` (`major`, `minor`, or `patch`).
|
|
79
|
+
3. Submit a pull request.
|
|
80
|
+
4. When all checks succeed, squash-merge to `main` and delete the feature branch on GitHub.
|
|
81
|
+
5. Execute `npm run postPR` (with interactive browser authentication).
|
|
82
|
+
6. Wait until `npmjs.com` has processed the publication.
|
|
83
|
+
7. Use `git pull`, `npm ci`, and `pm2 restart kilotest` (but **not** `npm audit fix`) to deploy the revised `main` branch on the public server.
|
|
84
|
+
|
|
85
|
+
### API changes
|
|
86
|
+
|
|
87
|
+
When you **make an API or tool contract change** in a feature branch:
|
|
88
|
+
|
|
89
|
+
1. `lhm.plugin.json`: Transform it to match `api/schemas.ts` and `mcp.ts`.
|
|
90
|
+
2. `llms.txt`, `llms-full.txt`, `capability.md`, `README.md`: Update parameter and path names.
|
|
91
|
+
3. Stage, commit, and optionally push all changes.
|
|
92
|
+
4. Execute `npm run prePR -- <level>` (`major`, `minor`, or `patch`).
|
|
93
|
+
5. Submit a pull request.
|
|
94
|
+
6. When all checks succeed, squash-merge to `main`.
|
|
95
|
+
7. Execute `npm run postPR` (with interactive browser authentication).
|
|
96
|
+
8. Wait until `npmjs.com` has processed the publication.
|
|
97
|
+
9. Use `git pull`, `npm ci`, and `pm2 restart kilotest` (but **not** `npm audit fix`) to deploy the revised `main` branch on the public server.
|
|
98
|
+
10. Visit the [RapidAPI Studio](https://rapidapi.com/studio) and update the API definition at `Hub Listing` → `Definitions` → `CI/CD` → `Import OpenAPI` by uploading the regenerated `openapi-3.0.yaml`.
|
|
99
|
+
|
|
100
|
+
If any step fails, see the details in `docs/AI-TOOLS.md` for troubleshooting instructions.
|
package/docs/AI-TOOLS.md
CHANGED
|
@@ -62,6 +62,8 @@ The external features that support the use of Kilotest as a collection of AI too
|
|
|
62
62
|
|
|
63
63
|
## Required maintenance
|
|
64
64
|
|
|
65
|
+
The maintenance routine is prescribed in the [README.md](../README.md) file.
|
|
66
|
+
|
|
65
67
|
Releasing a new version is a two-script procedure:
|
|
66
68
|
|
|
67
69
|
- On a feature branch, commit all substantive changes, then execute `npm run prePR -- <level>` (`major`, `minor`, or `patch`). The script bumps `package.json` and `package-lock.json`, regenerates `openapi.yaml`, `openapi-3.0.yaml`, and the versions of `server.json` and `lhm.plugin.json` by explicitly running `npm run generate`, commits and pushes the result, and records the branch name for the next step.
|
|
@@ -95,33 +97,6 @@ A change to the tool or API contract (tool names, parameter names, schemas, resp
|
|
|
95
97
|
- The LobeHub MCP Market listing is published from `lhm.plugin.json` and is non-automated, because LobeHub requires browser-based OAuth. A normal release pushes the updated file when `npm run postPR` runs `npm run publish:lhm`; to push a contract update without a release, run `npm run publish:lhm` manually.
|
|
96
98
|
- The RapidAPI Hub listing stores a copy of the API endpoints. Its importer accepts only OpenAPI 3.0 documents, so after releasing a contract change, update the definition in Studio: `My APIs` → the Kilotest API project → `Hub Listing` → `Definitions` → `CI/CD` → `Import OpenAPI`, and upload the regenerated `openapi-3.0.yaml` (not `openapi.yaml`, which is 3.1 and is rejected). The `/publish/…` pages contain only listing metadata, not the spec.
|
|
97
99
|
|
|
98
|
-
### Step by step
|
|
99
|
-
|
|
100
|
-
When you make a change in a feature branch **without** any API or tool contract change, here are the maintenance steps:
|
|
101
|
-
|
|
102
|
-
1. Stage, commit, and optionally push all changes.
|
|
103
|
-
2. Execute `npm run prePR -- <level>` (`major`, `minor`, or `patch`).
|
|
104
|
-
3. Submit a pull request.
|
|
105
|
-
4. When all checks succeed, squash-merge to `main` and delete the feature branch on GitHub.
|
|
106
|
-
5. Execute `npm run postPR` (with interactive browser OAuth).
|
|
107
|
-
6. Wait until `npmjs.com` has processed the publication.
|
|
108
|
-
7. Use `git pull`, `npm ci`, and `pm2 restart kilotest` (but **not** `npm audit fix`) to deploy the revised `main` branch on the public server.
|
|
109
|
-
|
|
110
|
-
When you **make an API or tool contract change** in a feature branch, here are the maintenance steps:
|
|
111
|
-
|
|
112
|
-
1. `lhm.plugin.json`: Transform it to match `api/schemas.ts` and `mcp.ts`.
|
|
113
|
-
2. `llms.txt`, `llms-full.txt`, `capability.md`, `README.md`: Update parameter and path names.
|
|
114
|
-
3. Stage, commit, and optionally push all changes.
|
|
115
|
-
4. Execute `npm run prePR -- <level>` (`major`, `minor`, or `patch`).
|
|
116
|
-
5. Submit a pull request.
|
|
117
|
-
6. When all checks succeed, squash-merge to `main`.
|
|
118
|
-
7. Execute `npm run postPR` (with interactive browser OAuth).
|
|
119
|
-
8. Wait until `npmjs.com` has processed the publication.
|
|
120
|
-
9. Use `git pull`, `npm ci`, and `pm2 restart kilotest` (but **not** `npm audit fix`) to deploy the revised `main` branch on the public server.
|
|
121
|
-
10. Visit the [RapidAPI Studio](https://rapidapi.com/studio) and update the API definition at `Hub Listing` → `Definitions` → `CI/CD` → `Import OpenAPI` by uploading the regenerated `openapi-3.0.yaml`.
|
|
122
|
-
|
|
123
|
-
If any step fails, see the details above for troubleshooting instructions.
|
|
124
|
-
|
|
125
100
|
## Use cases
|
|
126
101
|
|
|
127
102
|
The rationale for Kilotest as a collection of tools for language models is set forth in the `llms-full.txt` file and is not repeated here.
|
package/lhm.plugin.json
CHANGED
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.0.
|
|
5
|
+
version: 60.0.8
|
|
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.0.
|
|
5
|
+
version: 60.0.8
|
|
6
6
|
license:
|
|
7
7
|
name: MIT
|
|
8
8
|
identifier: MIT
|
package/package.json
CHANGED
package/scripts/postPR.ts
CHANGED
|
@@ -76,12 +76,13 @@ if (branchVersion !== mainVersion) {
|
|
|
76
76
|
console.error(`main is at version ${mainVersion} but ${branch} is at ${branchVersion}; merge the pull request first`);
|
|
77
77
|
process.exit(1);
|
|
78
78
|
}
|
|
79
|
+
run('npm', ['login']);
|
|
79
80
|
run('npm', ['publish']);
|
|
80
81
|
run('npm', ['run', 'publish:lhm']);
|
|
81
82
|
// Branch cleanup is best-effort: deletion must precede pruning, because "git branch -d" checks mergedness against the upstream ref, which pruning would remove.
|
|
82
83
|
const deleted = spawnSync('git', ['branch', '-d', branch], {stdio: 'inherit'});
|
|
83
84
|
if (deleted.status !== 0) {
|
|
84
|
-
console.warn(`Could not delete ${branch}; delete it
|
|
85
|
+
console.warn(`Could not delete ${branch}; delete it after confirming the merge`);
|
|
85
86
|
}
|
|
86
87
|
if (spawnSync('git', ['remote', 'prune', 'origin'], {stdio: 'inherit'}).status !== 0) {
|
|
87
88
|
console.warn('git remote prune origin failed');
|
package/server.json
CHANGED
package/style.css
CHANGED
|
@@ -118,6 +118,15 @@ legend {
|
|
|
118
118
|
li, p {
|
|
119
119
|
line-height: 1.5;
|
|
120
120
|
}
|
|
121
|
+
ol.links li > a, p.links > a, ul.links li > a, ul.nav li > a {
|
|
122
|
+
display: block;
|
|
123
|
+
box-sizing: border-box;
|
|
124
|
+
min-height: 44px;
|
|
125
|
+
min-width: 44px;
|
|
126
|
+
margin-right: 1rem;
|
|
127
|
+
padding-left: 0.25rem;
|
|
128
|
+
padding-top: 0.5rem;
|
|
129
|
+
}
|
|
121
130
|
p {
|
|
122
131
|
margin: 0.5rem 0;
|
|
123
132
|
}
|
|
@@ -180,15 +189,6 @@ ul {
|
|
|
180
189
|
ul.pseudoTopLevel {
|
|
181
190
|
list-style: disc;
|
|
182
191
|
}
|
|
183
|
-
ul.links li > a, ul.nav li > a {
|
|
184
|
-
display: block;
|
|
185
|
-
box-sizing: border-box;
|
|
186
|
-
min-height: 44px;
|
|
187
|
-
min-width: 44px;
|
|
188
|
-
margin-right: 1rem;
|
|
189
|
-
padding-left: 0.25rem;
|
|
190
|
-
padding-top: 0.5rem;
|
|
191
|
-
}
|
|
192
192
|
ul.nav {
|
|
193
193
|
padding-inline-start: 0.25rem;
|
|
194
194
|
}
|
package/web/listIssues/index.ts
CHANGED
|
@@ -165,13 +165,13 @@ const getHistory = async (
|
|
|
165
165
|
});
|
|
166
166
|
// Initialize the lines with a list of the reports, or a statement that there is only one.
|
|
167
167
|
const lines = history.lines.length > 1
|
|
168
|
-
? [`${margin}<ol>`, ...history.lines, `${margin}</ol>`]
|
|
168
|
+
? [`${margin}<ol class="links">`, ...history.lines, `${margin}</ol>`]
|
|
169
169
|
: [`${margin}<p>This is the only available report about the page.</p>`];
|
|
170
170
|
// If this report is the latest about the page:
|
|
171
171
|
if (isLatest) {
|
|
172
172
|
// Add a link to the form for requesting a retest to the lines.
|
|
173
173
|
lines.push(
|
|
174
|
-
`${margin}<p><a href="/requestRetestForm.html/${reportID}">Request a retest</a></p>`
|
|
174
|
+
`${margin}<p class="links"><a href="/requestRetestForm.html/${reportID}">Request a retest</a></p>`
|
|
175
175
|
);
|
|
176
176
|
}
|
|
177
177
|
// Replace the bare list items with the assembled section lines.
|
|
@@ -238,7 +238,7 @@ const populateQuery = async (reportID: string, query: Record<string, any>) => {
|
|
|
238
238
|
// Add the start of a list item to the lines.
|
|
239
239
|
detailsLines.push(`${margin} <li>`);
|
|
240
240
|
// Add a heading summarizing the issue to the lines.
|
|
241
|
-
detailsLines.push(`${margin} <
|
|
241
|
+
detailsLines.push(`${margin} <h3>${summary}</h3>`);
|
|
242
242
|
// Add the issue facts to the lines.
|
|
243
243
|
detailsLines.push(
|
|
244
244
|
...getIssueFactsLines(report, issueID, `${margin} `, 'pseudoTopLevel')
|
|
@@ -246,7 +246,7 @@ const populateQuery = async (reportID: string, query: Record<string, any>) => {
|
|
|
246
246
|
// Add the start of a link list to the lines.
|
|
247
247
|
detailsLines.push(`${margin} <ul class="nav">`);
|
|
248
248
|
const whereQuestionString = 'Where was the issue found?';
|
|
249
|
-
const labelString = `
|
|
249
|
+
const labelString = `The ${description} page exhibits the ${summary} issue. Where was the issue found?`;
|
|
250
250
|
const href = `href="/listViolators.html/${issueID}/${reportID}"`;
|
|
251
251
|
const label = `aria-label="${labelString}"`;
|
|
252
252
|
const whereLink = `<a ${href} ${label}>${whereQuestionString}</a>`;
|