specguard-mcp 0.1.1 → 0.1.3
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 +129 -22
- package/dist/bin/specguard-mcp.js +5 -0
- package/dist/bin/specguard-mcp.js.map +1 -1
- package/dist/src/config.d.ts +104 -14
- package/dist/src/config.js +78 -7
- package/dist/src/config.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +6 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/support/run-command.d.ts +42 -0
- package/dist/src/support/run-command.js +124 -8
- package/dist/src/support/run-command.js.map +1 -1
- package/dist/src/support/specguard-api.d.ts +53 -2
- package/dist/src/support/specguard-api.js +153 -8
- package/dist/src/support/specguard-api.js.map +1 -1
- package/dist/src/support/teardown.d.ts +33 -0
- package/dist/src/support/teardown.js +56 -0
- package/dist/src/support/teardown.js.map +1 -0
- package/dist/src/tools/add-repository.d.ts +55 -0
- package/dist/src/tools/add-repository.js +114 -0
- package/dist/src/tools/add-repository.js.map +1 -0
- package/dist/src/tools/args.d.ts +20 -0
- package/dist/src/tools/args.js +30 -0
- package/dist/src/tools/args.js.map +1 -1
- package/dist/src/tools/index.d.ts +33 -0
- package/dist/src/tools/index.js +41 -1
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/list-repositories.d.ts +75 -0
- package/dist/src/tools/list-repositories.js +112 -0
- package/dist/src/tools/list-repositories.js.map +1 -0
- package/dist/src/tools/repository-overview.js +35 -15
- package/dist/src/tools/repository-overview.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { requireApiConfig } from "../config.js";
|
|
2
|
-
import {
|
|
3
|
-
import { getJson } from "../support/specguard-api.js";
|
|
2
|
+
import { getJsonObject } from "../support/specguard-api.js";
|
|
4
3
|
import { optionalBoolean, optionalString } from "./args.js";
|
|
5
4
|
/**
|
|
6
5
|
* `GET /api/v1/repository` as a tool — shipped today in the platform
|
|
@@ -450,9 +449,17 @@ const getRepositoryOverview = {
|
|
|
450
449
|
"branch's: pass `commit_sha` to be answered about ONE named run instead — after pushing a " +
|
|
451
450
|
"commit and waiting for CI, say — then read `run_anchor` to confirm which run you were served, " +
|
|
452
451
|
"because an unknown sha falls back to the newest rather than erroring. " +
|
|
453
|
-
"Pass `unannotated_examples: true` to list the individual tests
|
|
452
|
+
"Pass `unannotated_examples: true` to list the individual tests carrying no `@intent` — the " +
|
|
454
453
|
"examples behind the annotated ratio, which is otherwise a percentage with nothing to act on — " +
|
|
455
454
|
"and, in the same answer, which AREAS of the suite carry the most of them. " +
|
|
455
|
+
"HOW MUCH OF THE SUITE SPECGUARD CAN READ IS A DIFFERENT QUESTION FROM HOW MUCH IS ANNOTATED, " +
|
|
456
|
+
"and `latest_run.intent_readings` answers it on every response with no flag to pass. A test " +
|
|
457
|
+
"written in the ordinary `Class#method behavior` shape yields an entity, an action and a " +
|
|
458
|
+
"behavior from its own description, so SpecGuard reads it even with no annotation: " +
|
|
459
|
+
"`intent_readings.derived` counts those, `authored` counts the annotated ones, and `unreadable` " +
|
|
460
|
+
"is the ONLY figure on this endpoint that means tests SpecGuard can say nothing about. Never " +
|
|
461
|
+
"read `total_specs - annotated_specs` as that population — on a suite that has never been " +
|
|
462
|
+
"annotated it is the whole suite, and almost all of it is readable. " +
|
|
456
463
|
"TWO BLOCKS COME BACK ON EVERY RESPONSE — no parameter to pass, no flag to set — and they " +
|
|
457
464
|
"answer what everything above silently depends on: is SpecGuard still being fed? " +
|
|
458
465
|
"`delivery_health` is why the figures may be STALE: `refusing` is a comparison of stamps, not a " +
|
|
@@ -668,10 +675,22 @@ const getRepositoryOverview = {
|
|
|
668
675
|
unannotated_examples: {
|
|
669
676
|
type: "boolean",
|
|
670
677
|
description: "Open a run's UNANNOTATED examples — the individual tests behind `latest_run`'s " +
|
|
671
|
-
"`total_specs` MINUS `annotated_specs
|
|
672
|
-
"\"SpecGuard cannot see the other N tests\". Every other population this endpoint reports " +
|
|
678
|
+
"`total_specs` MINUS `annotated_specs`. Every other population this endpoint reports " +
|
|
673
679
|
"can be walked down to the examples it counts; annotation coverage was the exception, so " +
|
|
674
680
|
"`annotated_ratio` told you how far you had to go and not one test to annotate. " +
|
|
681
|
+
"UNANNOTATED IS NOT THE SAME AS UNREADABLE, and this block reports both. Every row here " +
|
|
682
|
+
"lacks an `@intent`, which is exact — and most of them SpecGuard READS anyway, from the " +
|
|
683
|
+
"test's own description. Each row carries `reading` (`\"derived\"` or `\"unreadable\"`) and " +
|
|
684
|
+
"`derived_intent` (the `entity`/`action`/`behavior` it got, or `null`), and the block " +
|
|
685
|
+
"carries `derived_count` and `unreadable_count` beside `recorded_count`. Only " +
|
|
686
|
+
"`unreadable_count` is a count of tests SpecGuard can say nothing about; treat the rest " +
|
|
687
|
+
"as annotation debt, not as blindness. THE UNREADABLE ROWS COME FIRST in the list, ahead " +
|
|
688
|
+
"of the derived ones, so the cap cannot hide them. " +
|
|
689
|
+
"A derived reading is WEAKER than an authored one and must never be presented as " +
|
|
690
|
+
"equivalent: it carries no preconditions, its behavior is prose somebody wrote for a test " +
|
|
691
|
+
"runner's output rather than a declared statement of what the test is for, and its layer " +
|
|
692
|
+
"is inferred from the directory rather than declared — which is why `derived_intent` " +
|
|
693
|
+
"carries no `layer` key at all. " +
|
|
675
694
|
"THIS ONE IS A FLAG, NOT A NAME — the only argument here that takes `true` rather than a " +
|
|
676
695
|
"value. The others open the rows behind a LINE of a ranking and so carry that line's key; " +
|
|
677
696
|
"this opens a POPULATION, which is a subtraction on the run and has no line to name. " +
|
|
@@ -682,8 +701,9 @@ const getRepositoryOverview = {
|
|
|
682
701
|
"one is additional, not instead. " +
|
|
683
702
|
"Asking populates `latest_run.unannotated_examples` — up to 100 of the unannotated " +
|
|
684
703
|
"examples OF WHATEVER YOU ASKED FOR, each with `name`, `file_path`, `line_number` and " +
|
|
685
|
-
"`spec_file_path` (
|
|
686
|
-
"per-example drill-ins above), plus that same population's own
|
|
704
|
+
"`spec_file_path`, `reading` and `derived_intent` (SIX fields: no `duration_seconds` and " +
|
|
705
|
+
"no `outcome`, unlike the per-example drill-ins above), plus that same population's own " +
|
|
706
|
+
"`recorded_count`, `derived_count` and `unreadable_count`, the " +
|
|
687
707
|
"`limit` the row list was cut at, and `spec_file`/`spec_directory` ECHOED BACK as the " +
|
|
688
708
|
"server READ them — `null` for each one you did not send. " +
|
|
689
709
|
"READ THE ECHO BEFORE YOU READ THE COUNT. `unannotated_examples.recorded_count` — the " +
|
|
@@ -701,13 +721,17 @@ const getRepositoryOverview = {
|
|
|
701
721
|
"THE DEBT IS — one run's annotation debt rolled up by code AREA, which is what you pick " +
|
|
702
722
|
"the next `spec_directory` narrowing FROM. Both come from this ONE flag: there is no " +
|
|
703
723
|
"second parameter to send and no new value. " +
|
|
704
|
-
"The map's rows carry `path`, `unannotated_count
|
|
705
|
-
"counted against
|
|
724
|
+
"The map's rows carry `path`, `unannotated_count`, the `recorded_count` that area was " +
|
|
725
|
+
"counted against, and the same three-way split as the worklist — `authored_count`, " +
|
|
726
|
+
"`derived_count` and `unreadable_count`, which sum to `recorded_count` while the last two " +
|
|
727
|
+
"sum to `unannotated_count` (the operands, never a fraction), plus `directory_count` — EVERY area " +
|
|
706
728
|
"the run touched, not every area with debt, and not `rows.size` — and its OWN `limit`, " +
|
|
707
729
|
"which is 10 and NOT the worklist's 100. Two caps under one ask, and the difference is " +
|
|
708
730
|
"the kind of list: 100 caps a WORKLIST to work through, 10 caps a RANKING to pick from. " +
|
|
709
731
|
"The orders differ for the same reason — the worklist is file-navigable, the map is " +
|
|
710
|
-
"ranked `unannotated_count` DESC with `path` as a tiebreak
|
|
732
|
+
"ranked `unreadable_count` DESC, then `unannotated_count` DESC, with `path` as a tiebreak " +
|
|
733
|
+
"only — the areas SpecGuard cannot read lead, because a ten-row ranking led by debt on an " +
|
|
734
|
+
"unannotated suite is a ranking by area SIZE and the dark corners never surface. A fully-annotated area " +
|
|
711
735
|
"is a real ROW with `unannotated_count: 0`, never an omission. Those rows sort last " +
|
|
712
736
|
"COLLECTIVELY, so on a run with more areas than the cap they are cut and never seen, " +
|
|
713
737
|
"but on a run inside the cap they ARE LISTED and listed is correct. So `rows.size` is " +
|
|
@@ -759,7 +783,7 @@ const getRepositoryOverview = {
|
|
|
759
783
|
// asked explicitly for it not to be. See this file's header.
|
|
760
784
|
const unannotatedExamples = optionalBoolean(args["unannotated_examples"], "unannotated_examples");
|
|
761
785
|
const api = requireApiConfig(context.config);
|
|
762
|
-
const
|
|
786
|
+
const overview = await getJsonObject(api, "/api/v1/repository", {
|
|
763
787
|
branch,
|
|
764
788
|
spec_directory: specDirectory,
|
|
765
789
|
spec_file: specFile,
|
|
@@ -768,10 +792,6 @@ const getRepositoryOverview = {
|
|
|
768
792
|
commit_sha: commitSha,
|
|
769
793
|
unannotated_examples: unannotatedExamples === true ? "true" : undefined,
|
|
770
794
|
}, context.fetch);
|
|
771
|
-
if (typeof body !== "object" || body === null || Array.isArray(body)) {
|
|
772
|
-
throw new ApiError("SpecGuard returned a JSON value that was not an object.");
|
|
773
|
-
}
|
|
774
|
-
const overview = body;
|
|
775
795
|
return {
|
|
776
796
|
text: renderText(overview),
|
|
777
797
|
structured: overview,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository-overview.js","sourceRoot":"","sources":["../../../src/tools/repository-overview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"repository-overview.js","sourceRoot":"","sources":["../../../src/tools/repository-overview.ts"],"names":[],"mappings":"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"}
|