specguard-mcp 0.1.11 → 0.1.12
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 +15 -6
- package/dist/src/tools/list-repositories.d.ts +39 -10
- package/dist/src/tools/list-repositories.js +115 -19
- package/dist/src/tools/list-repositories.js.map +1 -1
- package/dist/src/tools/registrable-repositories.d.ts +7 -2
- package/dist/src/tools/registrable-repositories.js +7 -2
- package/dist/src/tools/registrable-repositories.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -331,14 +331,23 @@ ask about*, which is the one question no other tool here can answer. `get_reposi
|
|
|
331
331
|
no repository because its `sgk_…` key **is** the repository, so without this an agent can only report
|
|
332
332
|
on a repository somebody already named for it.
|
|
333
333
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
334
|
+
The credential decides which repositories are *in* the answer (owned, plus shared with them
|
|
335
|
+
through a membership); the three optional asks below narrow **within** that set — never around it.
|
|
336
|
+
The endpoint has served them since SpecGuard's SPGD-940 (`ef6236d`), composed through the same
|
|
337
|
+
`RepositoryNarrowing` concern the web grid reads, and this tool forwards them rather than
|
|
338
|
+
re-deriving them. A repository the person neither owns nor was given access to never enters the
|
|
339
|
+
response, so no ask can filter it *in* either. A blank value is no ask: passing an empty string
|
|
340
|
+
and omitting the argument make the identical request.
|
|
341
|
+
|
|
342
|
+
| argument | |
|
|
343
|
+
| --- | --- |
|
|
344
|
+
| `q` | keep only repositories whose `full_name` (`org/repo`) contains this substring, case-insensitively. A plain substring, not a pattern — the LIKE wildcards `%`/`_` are escaped server-side, so `org/my_repo` matches itself. A match-less ask is an empty list, not an error |
|
|
345
|
+
| `role` | `"owned"` or `"shared"` — one half of the list's mix: the repositories this person owns, or the ones shared with them. Mind the spelling: the *ask* values are `owned`/`shared`, while each entry's `role` field reads `owner`/`member` — `role: "owner"` is not a valid ask and settles to no ask (full list, no error) |
|
|
346
|
+
| `sort` | `"stale"` — re-order stalest-first: repositories CI has never ingested a run for first, then least-recently-ingested, with `full_name` breaking ties so two calls agree element for element. The same entries, a different order; the default order stays `full_name` ascending |
|
|
339
347
|
|
|
340
348
|
The body comes back as SpecGuard serves it — `{"repositories": […]}`, each entry carrying `id`,
|
|
341
|
-
`full_name`, `name`, `registered_at` and `role`, ordered by `full_name` ascending
|
|
349
|
+
`full_name`, `name`, `registered_at` and `role`, ordered by `full_name` ascending unless `sort`
|
|
350
|
+
asks otherwise. The first four are
|
|
342
351
|
deliberately the same four fields, under the same names, that `get_repository_overview` serves in its
|
|
343
352
|
own `repository` block, so a client that reads one reads the other. `role` is `owner` or `member`:
|
|
344
353
|
the list mixes repositories this person owns with repositories somebody shared with them, and nothing
|
|
@@ -39,14 +39,41 @@ import type { ToolDefinition } from "./types.js";
|
|
|
39
39
|
* makes a 401 or an unset variable name the one the OPERATOR of this tool has
|
|
40
40
|
* to go and fix. See `config.ts`.
|
|
41
41
|
*
|
|
42
|
-
* ==
|
|
42
|
+
* == The credential is the SCOPE, and the arguments narrow WITHIN it
|
|
43
43
|
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
44
|
+
* This file first shipped argument-less on a premise that has since rotted: it
|
|
45
|
+
* said "the endpoint takes no parameters", because the person the `sgu_` key
|
|
46
|
+
* speaks for was the entire scope of the answer. That stopped being true on
|
|
47
|
+
* 2026-09-05, when specguard `ef6236d` (SPGD-940, #941) grew
|
|
48
|
+
* `GET /api/v1/repositories` three narrowing asks through the shared
|
|
49
|
+
* `RepositoryNarrowing` concern — `?q=` (case-insensitive substring on
|
|
50
|
+
* `github_full_name`, with the LIKE wildcards escaped server-side, so a
|
|
51
|
+
* literal `org/my_repo` does not widen into a pattern match), `?role=owned`
|
|
52
|
+
* and `?role=shared` (the exact partition of the accessible set into owned and
|
|
53
|
+
* shared halves), and `?sort=stale` (never-ingested repositories first, then
|
|
54
|
+
* least-recently-ingested, `github_full_name` breaking ties so the order is
|
|
55
|
+
* deterministic). The concern's own comment says the endpoint reads them "for
|
|
56
|
+
* a machine" — and this bridge IS that machine, so they are forwarded here
|
|
57
|
+
* rather than re-invented.
|
|
58
|
+
*
|
|
59
|
+
* What has NOT changed is which side of the boundary the asks sit on.
|
|
60
|
+
* `Repository.accessible_by` — owned UNION shared-through-a-membership — is
|
|
61
|
+
* still the platform's read-side boundary, and the controller chains every ask
|
|
62
|
+
* onto the relation that boundary already admitted
|
|
63
|
+
* (`narrow_repositories(authorized_repositories, …)`): a repository the person
|
|
64
|
+
* neither owns nor is a member of never ENTERS the relation, so no argument
|
|
65
|
+
* here widens the answer — it can only narrow, or re-order, what the
|
|
66
|
+
* credential already admits. Out-of-vocabulary values are the server's to
|
|
67
|
+
* clamp, not ours: an unknown `role` or `sort` settles to the no-ask, never a
|
|
68
|
+
* 400, which is also why a value that reaches the wire is passed through
|
|
69
|
+
* verbatim rather than validated against a second vocabulary here.
|
|
70
|
+
*
|
|
71
|
+
* Blank is no ask, and so is undefined: `optionalString` returns `undefined`
|
|
72
|
+
* for a blank value and `getJson` omits an `undefined` query entry, so
|
|
73
|
+
* declining an ask and omitting the argument are the same wire request — the
|
|
74
|
+
* established spelling in this codebase (`repository-overview.ts` states it
|
|
75
|
+
* as build-don't-stringify), and the reason the no-argument request below is
|
|
76
|
+
* byte-identical to the one this tool made before it had arguments at all.
|
|
50
77
|
*
|
|
51
78
|
* == The response is passed through, not re-modelled
|
|
52
79
|
*
|
|
@@ -67,9 +94,11 @@ import type { ToolDefinition } from "./types.js";
|
|
|
67
94
|
*
|
|
68
95
|
* The order is `full_name` ascending, which the controller picks as the only
|
|
69
96
|
* column a client can page or diff against without SpecGuard promising an id
|
|
70
|
-
* ordering it has not designed
|
|
71
|
-
*
|
|
72
|
-
* order is
|
|
97
|
+
* ordering it has not designed — and `?sort=stale` re-sequences exactly that
|
|
98
|
+
* loaded set rather than issuing a different query, so the entries never
|
|
99
|
+
* change, only their order does. It is stated here for the same reason the
|
|
100
|
+
* other tool states its orders: a list whose order is a coincidence and a list
|
|
101
|
+
* whose order is a contract look identical in a response body.
|
|
73
102
|
*/
|
|
74
103
|
declare const listRepositories: ToolDefinition;
|
|
75
104
|
export default listRepositories;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getJsonObject, requireUserApiConfig } from "../support/specguard-api.js";
|
|
2
|
+
import { optionalString } from "./args.js";
|
|
2
3
|
/**
|
|
3
4
|
* `GET /api/v1/repositories` as a tool — shipped today in the platform
|
|
4
5
|
* (`specguard/config/routes.rb`, `Api::V1::UserRepositoriesController#index`).
|
|
@@ -39,14 +40,41 @@ import { getJsonObject, requireUserApiConfig } from "../support/specguard-api.js
|
|
|
39
40
|
* makes a 401 or an unset variable name the one the OPERATOR of this tool has
|
|
40
41
|
* to go and fix. See `config.ts`.
|
|
41
42
|
*
|
|
42
|
-
* ==
|
|
43
|
+
* == The credential is the SCOPE, and the arguments narrow WITHIN it
|
|
43
44
|
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
45
|
+
* This file first shipped argument-less on a premise that has since rotted: it
|
|
46
|
+
* said "the endpoint takes no parameters", because the person the `sgu_` key
|
|
47
|
+
* speaks for was the entire scope of the answer. That stopped being true on
|
|
48
|
+
* 2026-09-05, when specguard `ef6236d` (SPGD-940, #941) grew
|
|
49
|
+
* `GET /api/v1/repositories` three narrowing asks through the shared
|
|
50
|
+
* `RepositoryNarrowing` concern — `?q=` (case-insensitive substring on
|
|
51
|
+
* `github_full_name`, with the LIKE wildcards escaped server-side, so a
|
|
52
|
+
* literal `org/my_repo` does not widen into a pattern match), `?role=owned`
|
|
53
|
+
* and `?role=shared` (the exact partition of the accessible set into owned and
|
|
54
|
+
* shared halves), and `?sort=stale` (never-ingested repositories first, then
|
|
55
|
+
* least-recently-ingested, `github_full_name` breaking ties so the order is
|
|
56
|
+
* deterministic). The concern's own comment says the endpoint reads them "for
|
|
57
|
+
* a machine" — and this bridge IS that machine, so they are forwarded here
|
|
58
|
+
* rather than re-invented.
|
|
59
|
+
*
|
|
60
|
+
* What has NOT changed is which side of the boundary the asks sit on.
|
|
61
|
+
* `Repository.accessible_by` — owned UNION shared-through-a-membership — is
|
|
62
|
+
* still the platform's read-side boundary, and the controller chains every ask
|
|
63
|
+
* onto the relation that boundary already admitted
|
|
64
|
+
* (`narrow_repositories(authorized_repositories, …)`): a repository the person
|
|
65
|
+
* neither owns nor is a member of never ENTERS the relation, so no argument
|
|
66
|
+
* here widens the answer — it can only narrow, or re-order, what the
|
|
67
|
+
* credential already admits. Out-of-vocabulary values are the server's to
|
|
68
|
+
* clamp, not ours: an unknown `role` or `sort` settles to the no-ask, never a
|
|
69
|
+
* 400, which is also why a value that reaches the wire is passed through
|
|
70
|
+
* verbatim rather than validated against a second vocabulary here.
|
|
71
|
+
*
|
|
72
|
+
* Blank is no ask, and so is undefined: `optionalString` returns `undefined`
|
|
73
|
+
* for a blank value and `getJson` omits an `undefined` query entry, so
|
|
74
|
+
* declining an ask and omitting the argument are the same wire request — the
|
|
75
|
+
* established spelling in this codebase (`repository-overview.ts` states it
|
|
76
|
+
* as build-don't-stringify), and the reason the no-argument request below is
|
|
77
|
+
* byte-identical to the one this tool made before it had arguments at all.
|
|
50
78
|
*
|
|
51
79
|
* == The response is passed through, not re-modelled
|
|
52
80
|
*
|
|
@@ -67,9 +95,11 @@ import { getJsonObject, requireUserApiConfig } from "../support/specguard-api.js
|
|
|
67
95
|
*
|
|
68
96
|
* The order is `full_name` ascending, which the controller picks as the only
|
|
69
97
|
* column a client can page or diff against without SpecGuard promising an id
|
|
70
|
-
* ordering it has not designed
|
|
71
|
-
*
|
|
72
|
-
* order is
|
|
98
|
+
* ordering it has not designed — and `?sort=stale` re-sequences exactly that
|
|
99
|
+
* loaded set rather than issuing a different query, so the entries never
|
|
100
|
+
* change, only their order does. It is stated here for the same reason the
|
|
101
|
+
* other tool states its orders: a list whose order is a coincidence and a list
|
|
102
|
+
* whose order is a contract look identical in a response body.
|
|
73
103
|
*/
|
|
74
104
|
const listRepositories = {
|
|
75
105
|
name: "list_repositories",
|
|
@@ -82,7 +112,14 @@ const listRepositories = {
|
|
|
82
112
|
"`role` is `owner` or `member`: the list mixes repositories this person owns with " +
|
|
83
113
|
"repositories somebody shared with them, and nothing else distinguishes the two — read it " +
|
|
84
114
|
"before assuming a repository is yours to administer. " +
|
|
85
|
-
"
|
|
115
|
+
"Three optional asks narrow WITHIN that set — none of them can widen it — all optional, " +
|
|
116
|
+
"composable on one call: `q` (case-insensitive substring on `full_name`), " +
|
|
117
|
+
"`role: \"owned\"` or `\"shared\"` (one half of the owned/shared mix — note the ask is " +
|
|
118
|
+
"spelled `owned`, not the response field's `owner`), and `sort: \"stale\"` (repositories " +
|
|
119
|
+
"CI has never ingested a run for first, then least-recently-ingested, `full_name` " +
|
|
120
|
+
"breaking ties). Omit them all and the request is the plain full list. " +
|
|
121
|
+
"Ordered by `full_name` ascending unless `sort` asks otherwise, and stable across calls " +
|
|
122
|
+
"either way. " +
|
|
86
123
|
"The set is exactly what this person may see — a repository they neither own nor were given " +
|
|
87
124
|
"access to is absent rather than filtered, so an empty list means no access, never an error. " +
|
|
88
125
|
"Needs SPECGUARD_USER_API_KEY (an sgu_… key), which is a DIFFERENT credential from the " +
|
|
@@ -90,18 +127,77 @@ const listRepositories = {
|
|
|
90
127
|
"place.",
|
|
91
128
|
inputSchema: {
|
|
92
129
|
type: "object",
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
130
|
+
properties: {
|
|
131
|
+
q: {
|
|
132
|
+
type: "string",
|
|
133
|
+
description: "Keep only the repositories whose `github_full_name` (`org/repo`) CONTAINS this " +
|
|
134
|
+
"substring, case-insensitively — the same ask the deployment's web grid reads. " +
|
|
135
|
+
"A plain substring, not a pattern: the server matches with `ILIKE '%…%'` and escapes " +
|
|
136
|
+
"the LIKE wildcards (`%`, `_`, `\\`) first, so `org/my_repo` matches itself rather " +
|
|
137
|
+
"than widening into `my-repo` and `myxrepo`. " +
|
|
138
|
+
"It narrows the SAME set the plain call serves — a repository the credential does not " +
|
|
139
|
+
"admit never enters the response, so no `q` can make one appear — and an ask that " +
|
|
140
|
+
"matches nothing is an empty list with a 200, the same answer as having no access, " +
|
|
141
|
+
"not an error. " +
|
|
142
|
+
"Blank (or null) is no ask: the request is then byte-identical to omitting the " +
|
|
143
|
+
"argument.",
|
|
144
|
+
},
|
|
145
|
+
role: {
|
|
146
|
+
type: "string",
|
|
147
|
+
enum: ["owned", "shared"],
|
|
148
|
+
description: "Keep only ONE half of the list's mix: `owned` keeps the repositories this person " +
|
|
149
|
+
"owns, `shared` keeps the ones somebody shared with them. The two partition the " +
|
|
150
|
+
"accessible set exactly — a repository owned AND shared cannot exist by construction, " +
|
|
151
|
+
"so nothing is lost by asking for one half — and both chain onto the credential " +
|
|
152
|
+
"boundary, so neither half can be wider than the plain call's answer. " +
|
|
153
|
+
"THE ASK VALUES ARE SPELLED DIFFERENTLY FROM THE RESPONSE FIELD: an entry's `role` is " +
|
|
154
|
+
"`\"owner\"` or `\"member\"`, but the ask is `owned`/`shared` — send `role: " +
|
|
155
|
+
"\"owner\"` and you are not asking for anything. A client that honours this schema " +
|
|
156
|
+
"cannot send it (the enum refuses it before the call); a client that bypasses the " +
|
|
157
|
+
"schema gets the server's clamp, where any value outside `owned`/`shared` settles to " +
|
|
158
|
+
"the no-ask and the full list is served — never an error. " +
|
|
159
|
+
"Blank (or null) is no ask: byte-identical to omitting the argument.",
|
|
160
|
+
},
|
|
161
|
+
sort: {
|
|
162
|
+
type: "string",
|
|
163
|
+
enum: ["stale"],
|
|
164
|
+
description: "Re-order the list stalest-first. The default order is `full_name` ascending, which " +
|
|
165
|
+
"is stable across calls but says nothing about what needs attention; `stale` puts " +
|
|
166
|
+
"the repositories CI has NEVER ingested a run for FIRST (never-ingested is the " +
|
|
167
|
+
"stalest state on this list, not a zero), then least-recently-ingested, newest last, " +
|
|
168
|
+
"with `github_full_name` breaking ties so two calls with the same data agree element " +
|
|
169
|
+
"for element. " +
|
|
170
|
+
"It re-sequences the loaded set rather than issuing a different query: the same " +
|
|
171
|
+
"entries, a different order. `stale` is the only ordering the endpoint names — there " +
|
|
172
|
+
"is deliberately no word for the default, because omitting the argument already " +
|
|
173
|
+
"means it. " +
|
|
174
|
+
"Any other value a schema-bypassing client sends settles to the server's no-ask clamp " +
|
|
175
|
+
"(default order, no error); blank (or null) is no ask, byte-identical to omitting the " +
|
|
176
|
+
"argument.",
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
// Still CLOSED rather than open: `additionalProperties: false` is advertised
|
|
180
|
+
// in `tools/list`, so a client that honours the schema REJECTS an invented
|
|
96
181
|
// argument before the call is made. Nothing on this side refuses it —
|
|
97
|
-
// `server.ts` forwards `arguments` unvalidated
|
|
98
|
-
//
|
|
99
|
-
//
|
|
182
|
+
// `server.ts` forwards `arguments` unvalidated — so an open schema would
|
|
183
|
+
// have the argument silently dropped and the call answered as if it had
|
|
184
|
+
// been honoured. The enum vocabularies above are the server's own accepted
|
|
185
|
+
// values (`RepositoryNarrowing`'s ROLES and SORTS), not a second list this
|
|
186
|
+
// bridge keeps in step by hand.
|
|
100
187
|
additionalProperties: false,
|
|
101
188
|
},
|
|
102
|
-
async run(
|
|
189
|
+
async run(args, context) {
|
|
190
|
+
const q = optionalString(args["q"], "q");
|
|
191
|
+
const role = optionalString(args["role"], "role");
|
|
192
|
+
const sort = optionalString(args["sort"], "sort");
|
|
103
193
|
const api = requireUserApiConfig(context.config);
|
|
104
|
-
|
|
194
|
+
// Built, not stringified — the established rule for a query object
|
|
195
|
+
// (`repository-overview.ts`): `getJson` omits an `undefined` entry and sets
|
|
196
|
+
// everything else verbatim, so an ask declined (blank), omitted, or never
|
|
197
|
+
// defined all compose to the ONE request the caller meant, and with no asks
|
|
198
|
+
// at all the object is `{}` — the byte-identical request this tool made
|
|
199
|
+
// before it had arguments.
|
|
200
|
+
const listing = await getJsonObject(api, "/api/v1/repositories", { q, role, sort }, context.fetch);
|
|
105
201
|
return {
|
|
106
202
|
text: JSON.stringify(listing, null, 2),
|
|
107
203
|
structured: listing,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-repositories.js","sourceRoot":"","sources":["../../../src/tools/list-repositories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"list-repositories.js","sourceRoot":"","sources":["../../../src/tools/list-repositories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoGG;AACH,MAAM,gBAAgB,GAAmB;IACvC,IAAI,EAAE,mBAAmB;IACzB,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EACT,2FAA2F;QAC3F,2FAA2F;QAC3F,6DAA6D;QAC7D,6FAA6F;QAC7F,wDAAwD;QACxD,mFAAmF;QACnF,2FAA2F;QAC3F,uDAAuD;QACvD,yFAAyF;QACzF,2EAA2E;QAC3E,wFAAwF;QACxF,0FAA0F;QAC1F,mFAAmF;QACnF,wEAAwE;QACxE,yFAAyF;QACzF,cAAc;QACd,6FAA6F;QAC7F,8FAA8F;QAC9F,wFAAwF;QACxF,4FAA4F;QAC5F,QAAQ;IACV,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,CAAC,EAAE;gBACD,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,iFAAiF;oBACjF,gFAAgF;oBAChF,sFAAsF;oBACtF,oFAAoF;oBACpF,8CAA8C;oBAC9C,uFAAuF;oBACvF,mFAAmF;oBACnF,oFAAoF;oBACpF,gBAAgB;oBAChB,gFAAgF;oBAChF,WAAW;aACd;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;gBACzB,WAAW,EACT,mFAAmF;oBACnF,iFAAiF;oBACjF,uFAAuF;oBACvF,iFAAiF;oBACjF,uEAAuE;oBACvE,uFAAuF;oBACvF,6EAA6E;oBAC7E,oFAAoF;oBACpF,mFAAmF;oBACnF,sFAAsF;oBACtF,2DAA2D;oBAC3D,qEAAqE;aACxE;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,OAAO,CAAC;gBACf,WAAW,EACT,qFAAqF;oBACrF,mFAAmF;oBACnF,gFAAgF;oBAChF,sFAAsF;oBACtF,sFAAsF;oBACtF,eAAe;oBACf,iFAAiF;oBACjF,sFAAsF;oBACtF,iFAAiF;oBACjF,YAAY;oBACZ,uFAAuF;oBACvF,uFAAuF;oBACvF,WAAW;aACd;SACF;QACD,6EAA6E;QAC7E,2EAA2E;QAC3E,sEAAsE;QACtE,yEAAyE;QACzE,wEAAwE;QACxE,2EAA2E;QAC3E,2EAA2E;QAC3E,gCAAgC;QAChC,oBAAoB,EAAE,KAAK;KAC5B;IAED,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO;QACrB,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEjD,mEAAmE;QACnE,4EAA4E;QAC5E,0EAA0E;QAC1E,4EAA4E;QAC5E,wEAAwE;QACxE,2BAA2B;QAC3B,MAAM,OAAO,GAAG,MAAM,aAAa,CACjC,GAAG,EACH,sBAAsB,EACtB,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EACjB,OAAO,CAAC,KAAK,CACd,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC,UAAU,EAAE,OAAO;SACpB,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -42,10 +42,15 @@ import type { ToolDefinition } from "./types.js";
|
|
|
42
42
|
* ago" is a different fact from "you never had one", and the tool description
|
|
43
43
|
* is where an agent learns to branch on it.
|
|
44
44
|
*
|
|
45
|
-
* == No arguments, for the same reason `list_repositories`
|
|
45
|
+
* == No arguments, for the same reason `list_repositories` used to have none
|
|
46
46
|
*
|
|
47
47
|
* The credential is the whole of the scope. The endpoint takes no parameters,
|
|
48
|
-
* and nothing an argument could select reaches this answer.
|
|
48
|
+
* and nothing an argument could select reaches this answer. (`list_repositories`
|
|
49
|
+
* argued the same way and argued it the same amount — until its endpoint grew
|
|
50
|
+
* the SPGD-940 narrowing asks and the tool grew the arguments that forward
|
|
51
|
+
* them. This endpoint has grown no asks, so the argument-less shape here is
|
|
52
|
+
* still the honest one, and the sentence above keeps saying so rather than
|
|
53
|
+
* inheriting a reason that moved.)
|
|
49
54
|
*/
|
|
50
55
|
declare const registrableRepositories: ToolDefinition;
|
|
51
56
|
export default registrableRepositories;
|
|
@@ -42,10 +42,15 @@ import { getJsonObject, requireUserApiConfig } from "../support/specguard-api.js
|
|
|
42
42
|
* ago" is a different fact from "you never had one", and the tool description
|
|
43
43
|
* is where an agent learns to branch on it.
|
|
44
44
|
*
|
|
45
|
-
* == No arguments, for the same reason `list_repositories`
|
|
45
|
+
* == No arguments, for the same reason `list_repositories` used to have none
|
|
46
46
|
*
|
|
47
47
|
* The credential is the whole of the scope. The endpoint takes no parameters,
|
|
48
|
-
* and nothing an argument could select reaches this answer.
|
|
48
|
+
* and nothing an argument could select reaches this answer. (`list_repositories`
|
|
49
|
+
* argued the same way and argued it the same amount — until its endpoint grew
|
|
50
|
+
* the SPGD-940 narrowing asks and the tool grew the arguments that forward
|
|
51
|
+
* them. This endpoint has grown no asks, so the argument-less shape here is
|
|
52
|
+
* still the honest one, and the sentence above keeps saying so rather than
|
|
53
|
+
* inheriting a reason that moved.)
|
|
49
54
|
*/
|
|
50
55
|
const registrableRepositories = {
|
|
51
56
|
name: "registrable_repositories",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registrable-repositories.js","sourceRoot":"","sources":["../../../src/tools/registrable-repositories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGlF
|
|
1
|
+
{"version":3,"file":"registrable-repositories.js","sourceRoot":"","sources":["../../../src/tools/registrable-repositories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGlF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH,MAAM,uBAAuB,GAAmB;IAC9C,IAAI,EAAE,0BAA0B;IAChC,KAAK,EAAE,0BAA0B;IACjC,WAAW,EACT,4FAA4F;QAC5F,2FAA2F;QAC3F,sFAAsF;QACtF,6FAA6F;QAC7F,qFAAqF;QACrF,6FAA6F;QAC7F,yFAAyF;QACzF,mFAAmF;QACnF,8FAA8F;QAC9F,yFAAyF;QACzF,8FAA8F;QAC9F,4FAA4F;QAC5F,6FAA6F;QAC7F,wFAAwF;QACxF,4FAA4F;QAC5F,yFAAyF;QACzF,mFAAmF;QACnF,wFAAwF;QACxF,sFAAsF;QACtF,6EAA6E;IAC/E,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,4EAA4E;QAC5E,yEAAyE;QACzE,0EAA0E;QAC1E,0EAA0E;QAC1E,4CAA4C;QAC5C,oBAAoB,EAAE,KAAK;KAC5B;IAED,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO;QACtB,MAAM,GAAG,GAAG,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAG,MAAM,aAAa,CACjC,GAAG,EACH,kCAAkC,EAClC,EAAE,EACF,OAAO,CAAC,KAAK,CACd,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC,UAAU,EAAE,OAAO;SACpB,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
|