specguard-mcp 0.1.18 → 0.1.20

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 CHANGED
@@ -34,8 +34,8 @@ refuses to boot and takes the tools that needed no configuration down with it.
34
34
  | --- | --- | --- | --- |
35
35
  | `SPECGUARD_ENDPOINT` | `get_repository_overview`, `list_repositories`, `add_repository`, `registrable_repositories` | — | your SpecGuard instance's root URL, **including the scheme** — e.g. `https://specguard.example.com`, or `http://localhost:3000`. A value with no scheme is refused by name (`SPECGUARD_ENDPOINT is not a usable URL: "sg.example.com"`) rather than surfacing later as an opaque failure. `SPECGUARD_URL` is accepted as an alias, and is the name every message uses when it is the one you set. A blank value counts as unset, so leaving `SPECGUARD_ENDPOINT` empty in a templated config falls through to `SPECGUARD_URL` instead of suppressing it |
36
36
  | `SPECGUARD_API_KEY` | `get_repository_overview`, `near_duplicate_clusters` (default calls) | — | an agent/CI API key (`sgk_…`) issued by that deployment — a **per-repository** key, which is the single repository those tools answer about by default |
37
- | `SPECGUARD_USER_API_KEY` | `list_repositories` (fallback), `add_repository`, `registrable_repositories`, `remove_repository` (fallback), `create_repository_api_key` (fallback), `revoke_repository_api_key` (fallback), `list_repository_agent_keys` (fallback), `revoke_repository_agent_key` (fallback), `list_repository_agent_keys_presented_revoked` (fallback), `list_repository_members` (fallback), `add_repository_member` (fallback), `update_repository_member_permissions` (fallback), `remove_repository_member` (fallback), `rename_repository` | — | a **user** API key (`sgu_…`), minted from that deployment's account page. A different credential from the one above, not a second place to put the same value: SpecGuard decides which of them a request may use from the token's prefix, before it reads anything, and answers `401` for the other one. Set whichever your tools need — both, if you use both |
38
- | `SPECGUARD_AGENT_API_KEY` | `list_repositories` (preferred), `remove_repository` (preferred), `create_repository_api_key` (preferred), `revoke_repository_api_key` (preferred), `list_repository_agent_keys` (preferred), `revoke_repository_agent_key` (preferred), `list_repository_agent_keys_presented_revoked` (preferred), `list_repository_members` (preferred), `add_repository_member` (preferred), `update_repository_member_permissions` (preferred), `remove_repository_member` (preferred), `get_repository_overview` / `near_duplicate_clusters` **with** `repository` | — | an **agent** API key (`sga_…`), minted from that deployment's account page (Agent keys panel) with an explicit set of repositories and permissions. It speaks for nobody: its reach is exactly the set granted onto it, fixed at mint time, and every read is bounded by that set server-side. This is the credential to give an automated agent — one key, many repositories, none of a person's rights. When it and `SPECGUARD_USER_API_KEY` are both set, every repository-administration tool that answers either key — `list_repositories`, `remove_repository`, the members tools and the key-lifecycle tools — uses **this** one, so discovery stays inside the set the other tools can reach |
37
+ | `SPECGUARD_USER_API_KEY` | `list_repositories` (fallback), `add_repository`, `registrable_repositories`, `remove_repository` (fallback), `create_repository_api_key` (fallback), `revoke_repository_api_key` (fallback), `list_repository_agent_keys` (fallback), `revoke_repository_agent_key` (fallback), `list_repository_agent_keys_presented_revoked` (fallback), `list_repository_members` (fallback), `add_repository_member` (fallback), `update_repository_member_permissions` (fallback), `remove_repository_member` (fallback), `get_repository_overview` / `near_duplicate_clusters` **with** `repository` (fallback), `rename_repository` | — | a **user** API key (`sgu_…`), minted from that deployment's account page. A different credential from the one above, not a second place to put the same value: SpecGuard decides which of them a request may use from the token's prefix, before it reads anything, and answers `401` for the other one. Set whichever your tools need — both, if you use both |
38
+ | `SPECGUARD_AGENT_API_KEY` | `list_repositories` (preferred), `remove_repository` (preferred), `create_repository_api_key` (preferred), `revoke_repository_api_key` (preferred), `list_repository_agent_keys` (preferred), `revoke_repository_agent_key` (preferred), `list_repository_agent_keys_presented_revoked` (preferred), `list_repository_members` (preferred), `add_repository_member` (preferred), `update_repository_member_permissions` (preferred), `remove_repository_member` (preferred), `get_repository_overview` / `near_duplicate_clusters` **with** `repository` (preferred) | — | an **agent** API key (`sga_…`), minted from that deployment's account page (Agent keys panel) with an explicit set of repositories and permissions. It speaks for nobody: its reach is exactly the set granted onto it, fixed at mint time, and every read is bounded by that set server-side. This is the credential to give an automated agent — one key, many repositories, none of a person's rights. When it and `SPECGUARD_USER_API_KEY` are both set, every tool that answers either key — `list_repositories`, `remove_repository`, the members tools, the key-lifecycle tools, and `get_repository_overview` / `near_duplicate_clusters` **with** `repository` — uses **this** one, so discovery stays inside the set the other tools can reach |
39
39
  | `SPECGUARD_LINT_COMMAND` | `lint_intent_annotations` | `specguard-lint` | the command that runs the linter. Most Ruby projects need `bundle exec specguard-lint` |
40
40
  | `SPECGUARD_TIMEOUT_MS` | HTTP tools | `30000` | how long a call to SpecGuard may take |
41
41
 
@@ -106,24 +106,29 @@ branch window rather than between the last two runs.
106
106
  Everything above is answered about **one repository**, and which one has two spellings. By default
107
107
  it is the repository the configured `sgk_…` key resolves to — the key *is* the subject. Pass
108
108
  `repository` (the numeric id `list_repositories` reports) and the call goes to the **plural**
109
- endpoint, `GET /api/v1/repositories/:id`, under the **agent key** (`SPECGUARD_AGENT_API_KEY`,
110
- `sga_…`): same overview body, same ladder, every parameter below honoured identically — with one
109
+ endpoint, `GET /api/v1/repositories/:id`, which answers **either member credential**, whichever is
110
+ set: `SPECGUARD_AGENT_API_KEY` (`sga_…`) preferred, and the set of repositories granted onto it
111
+ at mint time is the boundary ids are looked up inside (`list_repositories` under the same key lists
112
+ exactly the set that is reachable) — or, when no agent key is set, `SPECGUARD_USER_API_KEY`
113
+ (`sgu_…`), a **person** key whose accessible set is the boundary instead. With both set the agent
114
+ key wins, so the answer stays inside the set that key can act on. Same overview body, same ladder,
115
+ every parameter below honoured identically — with one
111
116
  deliberate omission this path owns: `api_key` is **absent** from the plural body rather than nulled,
112
- because that block describes the credential that made the request and this request was not made
113
- with a repository key (an absent key there is the surface's shape, never a dropped block). Other
117
+ because that block describes the credential that made the request and no member credential is a
118
+ repository key (an absent key there is the surface's shape, never a dropped block). Other
114
119
  than that, only the subject moves. That is what makes the *other* repositories visible: an `sgk_`
115
120
  key is one repository
116
- by design, so an agent holding only that could never ask about a second one, while the agent key's
117
- own granted repository set is exactly the boundary the plural endpoint looks ids up inside (a
118
- repository outside the set answers 404, indistinguishable from one that does not exist
119
- `list_repositories` under the same key lists the set that is reachable). SpecGuard refuses each
121
+ by design, so a credential holding only that could never ask about a second one. The server owns
122
+ every refusal on the plural path: a repository outside the presented credential's grant answers
123
+ 404, indistinguishable from one that does not exist, person and agent alike. SpecGuard refuses each
120
124
  credential kind in the other's place before it reads anything, so the pairing is not mixable: the
121
- default call wants the `sgk_` key, the `repository` call wants the agent key, and a call made with
122
- the wrong one is refused *here*, naming the variable to set, before any request is made.
125
+ default call wants the `sgk_` key, the `repository` call wants a member key and a call made with
126
+ the wrong kind, or with neither member key set, is refused *here*, naming the variable(s) to set,
127
+ before any request is made.
123
128
 
124
129
  | argument | |
125
130
  | --- | --- |
126
- | `repository` | ask about THIS repository (its numeric id from `list_repositories`) under the **agent key**, instead of the one the `sgk_…` key resolves to — omit it for the default, `sgk_`-keyed call |
131
+ | `repository` | ask about THIS repository (its numeric id from `list_repositories`) under the **agent key** (`SPECGUARD_AGENT_API_KEY`, `sga_…`), or — when no agent key is set — the **user key** (`SPECGUARD_USER_API_KEY`, `sgu_…`), instead of the one the `sgk_…` key resolves to — omit it for the default, `sgk_`-keyed call |
127
132
  | `branch` | narrow the run **history** to one branch, for a real growth series — and unlock `unstable_tests` and `directory_growth`, which read the same window |
128
133
  | `spec_directory` | open ONE of the heaviest directories and list the spec files inside it |
129
134
  | `spec_file` | open ONE of the heaviest spec files and list the individual examples inside it |
@@ -515,13 +520,16 @@ every run; one call returns them all. (The server reads only that the `near_dupl
515
520
 
516
521
  | argument | |
517
522
  | --- | --- |
518
- | `repository` | census THIS repository (its numeric id from `list_repositories`) under the **agent key** (`SPECGUARD_AGENT_API_KEY`, `sga_…`), instead of the one the `sgk_…` key resolves to — omit it for the default, `sgk_`-keyed census |
523
+ | `repository` | census THIS repository (its numeric id from `list_repositories`) under the **agent key** (`SPECGUARD_AGENT_API_KEY`, `sga_…`), or — when no agent key is set — the **user key** (`SPECGUARD_USER_API_KEY`, `sgu_…`), instead of the one the `sgk_…` key resolves to — omit it for the default, `sgk_`-keyed census |
519
524
 
520
525
  The credential changes with `repository`, exactly as on `get_repository_overview`: the plural
521
- endpoint answers under the agent key, whose mint-time granted repository set is the boundary the id
522
- is looked up inside, and the two credential kinds refuse each other's tokens so a
523
- `repository` ask without the agent key is refused *here*, naming the variable, before any request
524
- is made.
526
+ endpoint answers **either member credential**, whichever is set the agent key preferred (its
527
+ mint-time granted repository set is the boundary the id is looked up inside), the user key when no
528
+ agent key is set (its accessible set is the boundary instead), the agent key winning when both are
529
+ present — and the credential kinds refuse each other's tokens, so a
530
+ `repository` ask with neither member key set is refused *here*, naming both variables, before any
531
+ request is made. A repository outside the presented credential's grant answers 404 at the server,
532
+ person and agent alike.
525
533
 
526
534
  Read the response with its own rules in mind:
527
535
 
@@ -544,9 +552,9 @@ Read the response with its own rules in mind:
544
552
  Without `repository`, same credential and endpoint as `get_repository_overview`'s default
545
553
  (`sgk_…` repository key on `GET /api/v1/repository`); the response is that body with the
546
554
  `near_duplicates` block opened, passed through unmodified. With `repository`, the plural endpoint
547
- answers under the agent key, exactly as on `get_repository_overview` — and carries that path's
548
- one deliberate omission: `api_key` is **absent** from the plural body rather than nulled, because
549
- the block describes the credential that made the request and this request was not made with a
555
+ answers either member credential, exactly as on `get_repository_overview` — and carries that
556
+ path's one deliberate omission: `api_key` is **absent** from the plural body rather than nulled,
557
+ because the block describes the credential that made the request and no member credential is a
550
558
  repository key (an absent key there is the surface's shape, never a dropped block).
551
559
 
552
560
  ### `remove_repository`
@@ -635,7 +643,9 @@ reads. With both set the **agent** key wins, so the revoke answers inside the sa
635
643
  Lists the agent keys (`sga_…` keys) covering a SpecGuard repository — the keys minted for people
636
644
  or automation principals from the /account page, each covering one or more repositories. One row
637
645
  per live key: `id`, `name`, `owner`, `token_hint`, `repository_count` (how many repositories the
638
- key's grant covers — the blast radius), `permissions` and `created_at`.
646
+ key's grant covers — the blast radius), `permissions`, `created_at` and `last_used_at` — when the
647
+ key's token last authenticated, `null` meaning the key has never been presented, so the inventory
648
+ answers "is this live key still being used" before you cut anything.
639
649
 
640
650
  | argument | |
641
651
  | --- | --- |
@@ -20,7 +20,10 @@ import type { ToolDefinition } from "./types.js";
20
20
  * this repository: `id`, `name`, `owner`, `token_hint`, `repository_count`
21
21
  * (the size of the key's stored set — the blast radius a revoke would land
22
22
  * on), `permissions` (rendered the way the web panel renders it, "read only"
23
- * for the minimal grant) and `created_at`. `token_hint` is a hint and never
23
+ * for the minimal grant), `created_at` and `last_used_at` (SPGD-1108 the
24
+ * offboarding arc's decision half: when the key's token last authenticated,
25
+ * null meaning the key has NEVER been presented — the negative is served, not
26
+ * omitted). `token_hint` is a hint and never
24
27
  * the token: the plaintext existed for exactly one response at mint time and
25
28
  * nothing persisted it. Revoked rows leave the listing — a retained revoked
26
29
  * row is not a credential — and the still-presented triage over those rows is
@@ -21,7 +21,10 @@ import { requireString } from "./args.js";
21
21
  * this repository: `id`, `name`, `owner`, `token_hint`, `repository_count`
22
22
  * (the size of the key's stored set — the blast radius a revoke would land
23
23
  * on), `permissions` (rendered the way the web panel renders it, "read only"
24
- * for the minimal grant) and `created_at`. `token_hint` is a hint and never
24
+ * for the minimal grant), `created_at` and `last_used_at` (SPGD-1108 the
25
+ * offboarding arc's decision half: when the key's token last authenticated,
26
+ * null meaning the key has NEVER been presented — the negative is served, not
27
+ * omitted). `token_hint` is a hint and never
25
28
  * the token: the plaintext existed for exactly one response at mint time and
26
29
  * nothing persisted it. Revoked rows leave the listing — a retained revoked
27
30
  * row is not a credential — and the still-presented triage over those rows is
@@ -40,7 +43,10 @@ const listRepositoryAgentKeys = {
40
43
  title: "List repository agent keys",
41
44
  description: "Lists the agent keys (`sga_…` keys) covering a SpecGuard repository: one row per live key " +
42
45
  "with its `id`, `name`, `owner`, `token_hint`, `repository_count` (how many repositories the " +
43
- "key's grant covers — the blast radius), `permissions` and `created_at`. " +
46
+ "key's grant covers — the blast radius), `permissions`, `created_at` and `last_used_at` " +
47
+ "when the key's token last authenticated, null meaning the key has never been presented, so " +
48
+ "the inventory answers \"is this live key still being used\" before a revoke — the decision " +
49
+ "half of offboarding. " +
44
50
  "Agent keys have NO mint tool on this bridge — minting is deliberately web-only — so the `id` " +
45
51
  "this listing serves is the ONLY way to name a key to `revoke_repository_agent_key`: list " +
46
52
  "first, then revoke. " +
@@ -1 +1 @@
1
- {"version":3,"file":"list-repository-agent-keys.js","sourceRoot":"","sources":["../../../src/tools/list-repository-agent-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,uBAAuB,GAAmB;IAC9C,IAAI,EAAE,4BAA4B;IAClC,KAAK,EAAE,4BAA4B;IACnC,WAAW,EACT,4FAA4F;QAC5F,8FAA8F;QAC9F,0EAA0E;QAC1E,+FAA+F;QAC/F,2FAA2F;QAC3F,sBAAsB;QACtB,+FAA+F;QAC/F,wFAAwF;QACxF,8FAA8F;QAC9F,sCAAsC;QACtC,wFAAwF;QACxF,yBAAyB;QACzB,iGAAiG;QACjG,8FAA8F;QAC9F,8FAA8F;QAC9F,wFAAwF;QACxF,4FAA4F;QAC5F,4FAA4F;QAC5F,+FAA+F;QAC/F,8FAA8F;QAC9F,mDAAmD;QACnD,kGAAkG;QAClG,oDAAoD;IACtD,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,gFAAgF;oBAChF,qEAAqE;aACxE;SACF;QACD,QAAQ,EAAE,CAAC,eAAe,CAAC;QAC3B,qEAAqE;QACrE,6EAA6E;QAC7E,uBAAuB;QACvB,oBAAoB,EAAE,KAAK;KAC5B;IAED,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO;QACrB,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC,CAAC;QAE3E,MAAM,GAAG,GAAG,2BAA2B,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAExD,MAAM,IAAI,GAAG,MAAM,aAAa,CAC9B,GAAG,EACH,wBAAwB,kBAAkB,CAAC,YAAY,CAAC,aAAa,EACrE,EAAE,EACF,OAAO,CAAC,KAAK,CACd,CAAC;QAEF,2EAA2E;QAC3E,2EAA2E;QAC3E,0EAA0E;QAC1E,mCAAmC;QACnC,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACnC,UAAU,EAAE,IAAI;SACjB,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
1
+ {"version":3,"file":"list-repository-agent-keys.js","sourceRoot":"","sources":["../../../src/tools/list-repository-agent-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,uBAAuB,GAAmB;IAC9C,IAAI,EAAE,4BAA4B;IAClC,KAAK,EAAE,4BAA4B;IACnC,WAAW,EACT,4FAA4F;QAC5F,8FAA8F;QAC9F,2FAA2F;QAC3F,6FAA6F;QAC7F,6FAA6F;QAC7F,uBAAuB;QACvB,+FAA+F;QAC/F,2FAA2F;QAC3F,sBAAsB;QACtB,+FAA+F;QAC/F,wFAAwF;QACxF,8FAA8F;QAC9F,sCAAsC;QACtC,wFAAwF;QACxF,yBAAyB;QACzB,iGAAiG;QACjG,8FAA8F;QAC9F,8FAA8F;QAC9F,wFAAwF;QACxF,4FAA4F;QAC5F,4FAA4F;QAC5F,+FAA+F;QAC/F,8FAA8F;QAC9F,mDAAmD;QACnD,kGAAkG;QAClG,oDAAoD;IACtD,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,gFAAgF;oBAChF,qEAAqE;aACxE;SACF;QACD,QAAQ,EAAE,CAAC,eAAe,CAAC;QAC3B,qEAAqE;QACrE,6EAA6E;QAC7E,uBAAuB;QACvB,oBAAoB,EAAE,KAAK;KAC5B;IAED,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO;QACrB,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC,CAAC;QAE3E,MAAM,GAAG,GAAG,2BAA2B,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAExD,MAAM,IAAI,GAAG,MAAM,aAAa,CAC9B,GAAG,EACH,wBAAwB,kBAAkB,CAAC,YAAY,CAAC,aAAa,EACrE,EAAE,EACF,OAAO,CAAC,KAAK,CACd,CAAC;QAEF,2EAA2E;QAC3E,2EAA2E;QAC3E,0EAA0E;QAC1E,mCAAmC;QACnC,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACnC,UAAU,EAAE,IAAI;SACjB,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
@@ -31,14 +31,18 @@ import type { ToolDefinition } from "./types.js";
31
31
  * run, and one call returns them all. What IS choosable, since SPGD-953, is
32
32
  * WHICH REPOSITORY is censused: an optional `repository` argument (a numeric id
33
33
  * from `list_repositories`) moves the call to the plural endpoint
34
- * `GET /api/v1/repositories/:id` under the AGENT key, same body (minus the
35
- * `api_key` block, which is ABSENT on that surface rather than nulled see
36
- * `repository-overview.ts` for why the omission is the server's, deliberately),
37
- * same ask, same cost gate. Without it the request is byte-for-byte the singular,
38
- * `sgk_`-bound one this tool has always made — and the cost argument above is
39
- * exactly why the argument is OPTIONAL rather than required: an agent that has
40
- * only ever had one reachable repository should not be asked to learn a second
41
- * credential to keep reading it.
34
+ * `GET /api/v1/repositories/:id` under either member credential, whichever is
35
+ * set the AGENT key preferred, and the USER key (a person credential, whose
36
+ * accessible set is the boundary the id is resolved inside) when no agent key
37
+ * is set; SPGD-1106 widened the plural arm from agent-only, on the same
38
+ * agent-wins/user-fallback terms every either-credential tool answers by. Same
39
+ * body (minus the `api_key` block, which is ABSENT on that surface rather than
40
+ * nulled see `repository-overview.ts` for why the omission is the server's,
41
+ * deliberately), same ask, same cost gate. Without it the request is
42
+ * byte-for-byte the singular, `sgk_`-bound one this tool has always made — and
43
+ * the cost argument above is exactly why the argument is OPTIONAL rather than
44
+ * required: an agent that has only ever had one reachable repository should not
45
+ * be asked to learn a second credential to keep reading it.
42
46
  *
43
47
  * `near_duplicates: "true"` is built rather than stringified for the same
44
48
  * reason `repository-overview.ts` builds its `unannotated_examples` key:
@@ -1,5 +1,5 @@
1
- import { requireAgentApiConfig, requireApiConfig } from "../config.js";
2
- import { getJsonObject } from "../support/specguard-api.js";
1
+ import { requireApiConfig } from "../config.js";
2
+ import { getJsonObject, requireUserOrAgentApiConfig } from "../support/specguard-api.js";
3
3
  import { optionalString } from "./args.js";
4
4
  /**
5
5
  * `GET /api/v1/repository?near_duplicates=` as a tool — shipped in the
@@ -33,14 +33,18 @@ import { optionalString } from "./args.js";
33
33
  * run, and one call returns them all. What IS choosable, since SPGD-953, is
34
34
  * WHICH REPOSITORY is censused: an optional `repository` argument (a numeric id
35
35
  * from `list_repositories`) moves the call to the plural endpoint
36
- * `GET /api/v1/repositories/:id` under the AGENT key, same body (minus the
37
- * `api_key` block, which is ABSENT on that surface rather than nulled see
38
- * `repository-overview.ts` for why the omission is the server's, deliberately),
39
- * same ask, same cost gate. Without it the request is byte-for-byte the singular,
40
- * `sgk_`-bound one this tool has always made — and the cost argument above is
41
- * exactly why the argument is OPTIONAL rather than required: an agent that has
42
- * only ever had one reachable repository should not be asked to learn a second
43
- * credential to keep reading it.
36
+ * `GET /api/v1/repositories/:id` under either member credential, whichever is
37
+ * set the AGENT key preferred, and the USER key (a person credential, whose
38
+ * accessible set is the boundary the id is resolved inside) when no agent key
39
+ * is set; SPGD-1106 widened the plural arm from agent-only, on the same
40
+ * agent-wins/user-fallback terms every either-credential tool answers by. Same
41
+ * body (minus the `api_key` block, which is ABSENT on that surface rather than
42
+ * nulled see `repository-overview.ts` for why the omission is the server's,
43
+ * deliberately), same ask, same cost gate. Without it the request is
44
+ * byte-for-byte the singular, `sgk_`-bound one this tool has always made — and
45
+ * the cost argument above is exactly why the argument is OPTIONAL rather than
46
+ * required: an agent that has only ever had one reachable repository should not
47
+ * be asked to learn a second credential to keep reading it.
44
48
  *
45
49
  * `near_duplicates: "true"` is built rather than stringified for the same
46
50
  * reason `repository-overview.ts` builds its `unannotated_examples` key:
@@ -81,9 +85,10 @@ const nearDuplicateClusters = {
81
85
  "`near_duplicates: null` on the plain overview. Calling this tool IS the ask; nothing about the " +
82
86
  "census is choosable — the clusters are the repository's, computed over every run, and one call " +
83
87
  "returns them all. WHICH repository is censused is the one choice there is: pass `repository` " +
84
- "(a numeric id from `list_repositories`) to census that named repository under the agent key, " +
85
- "or omit it to census the repository the configured sgk_… key resolves to, exactly as before " +
86
- "the argument existed. " +
88
+ "(a numeric id from `list_repositories`) to census that named repository under either member " +
89
+ "credential the agent key preferred, the person key when no agent key is set or omit it to " +
90
+ "census the repository the configured sgk_… key resolves to, exactly as before the argument " +
91
+ "existed. " +
87
92
  "READ THE DISCLOSURE KEYS BEFORE THE COUNT: `similarity_floor` and `similarity_basis` sit FIRST " +
88
93
  "in the block and qualify every cluster below them — a cluster count without what 'similar' " +
89
94
  "meant is a figure you cannot act on. `truncated: true` means the cluster list was cut at the " +
@@ -103,16 +108,18 @@ const nearDuplicateClusters = {
103
108
  "(`recorded_count: 0`), nothing embedded (`identity_count: 0`), nothing alike — are kept " +
104
109
  "distinguishable by those counts rather than collapsed into one empty list. " +
105
110
  "Same endpoints and credentials as `get_repository_overview`: without `repository`, an " +
106
- "`sgk_` repository key on `GET /api/v1/repository`; with `repository`, an `sga_` agent key " +
107
- "(SPECGUARD_AGENT_API_KEY) on `GET /api/v1/repositories/:id`, whose answer the key's own " +
108
- "granted repository set bounds. SpecGuard refuses each credential in the other's place, so " +
109
- "a `repository` ask without the agent key set is refused HERE, by name, before any request " +
110
- "is made. " +
111
+ "`sgk_` repository key on `GET /api/v1/repository`; with `repository`, EITHER member " +
112
+ "credential, whichever is set, on `GET /api/v1/repositories/:id` SPECGUARD_AGENT_API_KEY " +
113
+ "(an sga_… agent key, whose mint-time granted repository set bounds the answer) preferred, " +
114
+ "and, when that is not set, SPECGUARD_USER_API_KEY (an sgu_… key a PERSON key, whose " +
115
+ "accessible set bounds the answer instead); with both set the agent key wins. The server " +
116
+ "owns the refusals on that path: a repository outside the presented credential's grant " +
117
+ "answers 404, person and agent alike. " +
111
118
  "The response is the endpoint's full body with the `near_duplicates` block OPENED, passed " +
112
119
  "through unmodified — with the one surface difference `get_repository_overview` documents " +
113
120
  "for its own `repository` ask: on that plural path the `api_key` block is ABSENT from the " +
114
- "body rather than nulled (it describes the credential that made the request, and an agent " +
115
- "key is not a repository key), so an absent `api_key` there is the surface's shape, never " +
121
+ "body rather than nulled (it describes the credential that made the request, and no member " +
122
+ "credential is a repository key), so an absent `api_key` there is the surface's shape, never " +
116
123
  "a dropped block.",
117
124
  inputSchema: {
118
125
  type: "object",
@@ -122,11 +129,14 @@ const nearDuplicateClusters = {
122
129
  description: "Census THIS repository instead of the one the configured sgk_… key resolves to. The " +
123
130
  "value is the repository's NUMERIC ID, exactly as served in `list_repositories` " +
124
131
  "entries' `id` — not the `org/repo` handle. " +
125
- "The credential changes with it, because SpecGuard refuses each key kind in the " +
126
- "other's place: the call authenticates with SPECGUARD_AGENT_API_KEY (an sga_… agent " +
127
- "key) instead of SPECGUARD_API_KEY, and the key's granted repository set is the " +
128
- "boundary the id is resolved inside a repository outside the set answers 404, " +
129
- "indistinguishable from one that does not exist. The census itself is identical on " +
132
+ "The credential changes with it: the call authenticates with EITHER member credential, " +
133
+ "whichever is set SPECGUARD_AGENT_API_KEY (an sga_… agent key; the set of " +
134
+ "repositories granted onto it at mint time is the boundary the id is resolved " +
135
+ "inside) and, when that is not set, SPECGUARD_USER_API_KEY (an sgu_… key a PERSON " +
136
+ "key, whose accessible set is the boundary instead); with both set the agent key " +
137
+ "wins. The server owns the refusals on that path: a repository outside the " +
138
+ "presented credential's grant answers 404, indistinguishable from one that does " +
139
+ "not exist — person and agent alike. The census itself is identical on " +
130
140
  "either path: same block, same caps, same disclosure keys. " +
131
141
  "Omit it — or pass a blank — and the call is byte-for-byte the singular one under " +
132
142
  "SPECGUARD_API_KEY, exactly as before this argument existed.",
@@ -140,10 +150,12 @@ const nearDuplicateClusters = {
140
150
  // for the reason `repository-overview.ts` states at its own call site: the
141
151
  // pair (path, credential) must not be mixable, because either mixed pairing
142
152
  // is a 401 at the deployment by design and both are refused here, legibly,
143
- // instead.
153
+ // instead. The plural arm answers either member credential — the agent key
154
+ // preferred, the user key when no agent key is set (SPGD-1106) — and the
155
+ // singular arm is unchanged.
144
156
  const api = repository === undefined
145
157
  ? requireApiConfig(context.config)
146
- : requireAgentApiConfig(context.config);
158
+ : requireUserOrAgentApiConfig(context.config);
147
159
  const path = repository === undefined
148
160
  ? "/api/v1/repository"
149
161
  : `/api/v1/repositories/${encodeURIComponent(repository)}`;
@@ -1 +1 @@
1
- {"version":3,"file":"near-duplicate-clusters.js","sourceRoot":"","sources":["../../../src/tools/near-duplicate-clusters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkEG;AACH,MAAM,qBAAqB,GAAmB;IAC5C,IAAI,EAAE,yBAAyB;IAE/B,KAAK,EAAE,yBAAyB;IAEhC,WAAW,EACT,2FAA2F;QAC3F,gGAAgG;QAChG,gGAAgG;QAChG,gCAAgC;QAChC,kGAAkG;QAClG,iGAAiG;QACjG,gGAAgG;QAChG,iGAAiG;QACjG,iGAAiG;QACjG,+FAA+F;QAC/F,+FAA+F;QAC/F,8FAA8F;QAC9F,wBAAwB;QACxB,iGAAiG;QACjG,6FAA6F;QAC7F,+FAA+F;QAC/F,gGAAgG;QAChG,8DAA8D;QAC9D,iGAAiG;QACjG,8FAA8F;QAC9F,iGAAiG;QACjG,iGAAiG;QACjG,oGAAoG;QACpG,2FAA2F;QAC3F,mGAAmG;QACnG,8FAA8F;QAC9F,2BAA2B;QAC3B,6FAA6F;QAC7F,iFAAiF;QACjF,0FAA0F;QAC1F,6EAA6E;QAC7E,wFAAwF;QACxF,4FAA4F;QAC5F,0FAA0F;QAC1F,4FAA4F;QAC5F,4FAA4F;QAC5F,WAAW;QACX,2FAA2F;QAC3F,2FAA2F;QAC3F,2FAA2F;QAC3F,2FAA2F;QAC3F,2FAA2F;QAC3F,kBAAkB;IAEpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,sFAAsF;oBACtF,iFAAiF;oBACjF,6CAA6C;oBAC7C,iFAAiF;oBACjF,qFAAqF;oBACrF,iFAAiF;oBACjF,iFAAiF;oBACjF,oFAAoF;oBACpF,4DAA4D;oBAC5D,mFAAmF;oBACnF,6DAA6D;aAChE;SACF;QACD,oBAAoB,EAAE,KAAK;KAC5B;IAED,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO;QACrB,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;QACpE,4EAA4E;QAC5E,2EAA2E;QAC3E,4EAA4E;QAC5E,2EAA2E;QAC3E,WAAW;QACX,MAAM,GAAG,GACP,UAAU,KAAK,SAAS;YACtB,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC;YAClC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,IAAI,GACR,UAAU,KAAK,SAAS;YACtB,CAAC,CAAC,oBAAoB;YACtB,CAAC,CAAC,wBAAwB,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;QAE/D,MAAM,QAAQ,GAAG,MAAM,aAAa,CAClC,GAAG,EACH,IAAI,EACJ;YACE,uEAAuE;YACvE,mEAAmE;YACnE,kDAAkD;YAClD,eAAe,EAAE,MAAM;SACxB,EACD,OAAO,CAAC,KAAK,CACd,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACvC,UAAU,EAAE,QAAQ;SACrB,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"near-duplicate-clusters.js","sourceRoot":"","sources":["../../../src/tools/near-duplicate-clusters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsEG;AACH,MAAM,qBAAqB,GAAmB;IAC5C,IAAI,EAAE,yBAAyB;IAE/B,KAAK,EAAE,yBAAyB;IAEhC,WAAW,EACT,2FAA2F;QAC3F,gGAAgG;QAChG,gGAAgG;QAChG,gCAAgC;QAChC,kGAAkG;QAClG,iGAAiG;QACjG,gGAAgG;QAChG,iGAAiG;QACjG,iGAAiG;QACjG,+FAA+F;QAC/F,8FAA8F;QAC9F,gGAAgG;QAChG,6FAA6F;QAC7F,WAAW;QACX,iGAAiG;QACjG,6FAA6F;QAC7F,+FAA+F;QAC/F,gGAAgG;QAChG,8DAA8D;QAC9D,iGAAiG;QACjG,8FAA8F;QAC9F,iGAAiG;QACjG,iGAAiG;QACjG,oGAAoG;QACpG,2FAA2F;QAC3F,mGAAmG;QACnG,8FAA8F;QAC9F,2BAA2B;QAC3B,6FAA6F;QAC7F,iFAAiF;QACjF,0FAA0F;QAC1F,6EAA6E;QAC7E,wFAAwF;QACxF,sFAAsF;QACtF,4FAA4F;QAC5F,4FAA4F;QAC5F,wFAAwF;QACxF,0FAA0F;QAC1F,wFAAwF;QACxF,uCAAuC;QACvC,2FAA2F;QAC3F,2FAA2F;QAC3F,2FAA2F;QAC3F,4FAA4F;QAC5F,8FAA8F;QAC9F,kBAAkB;IAEpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,sFAAsF;oBACtF,iFAAiF;oBACjF,6CAA6C;oBAC7C,wFAAwF;oBACxF,6EAA6E;oBAC7E,+EAA+E;oBAC/E,qFAAqF;oBACrF,kFAAkF;oBAClF,4EAA4E;oBAC5E,iFAAiF;oBACjF,wEAAwE;oBACxE,4DAA4D;oBAC5D,mFAAmF;oBACnF,6DAA6D;aAChE;SACF;QACD,oBAAoB,EAAE,KAAK;KAC5B;IAED,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO;QACrB,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;QACpE,4EAA4E;QAC5E,2EAA2E;QAC3E,4EAA4E;QAC5E,2EAA2E;QAC3E,2EAA2E;QAC3E,yEAAyE;QACzE,6BAA6B;QAC7B,MAAM,GAAG,GACP,UAAU,KAAK,SAAS;YACtB,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC;YAClC,CAAC,CAAC,2BAA2B,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,IAAI,GACR,UAAU,KAAK,SAAS;YACtB,CAAC,CAAC,oBAAoB;YACtB,CAAC,CAAC,wBAAwB,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;QAE/D,MAAM,QAAQ,GAAG,MAAM,aAAa,CAClC,GAAG,EACH,IAAI,EACJ;YACE,uEAAuE;YACvE,mEAAmE;YACnE,kDAAkD;YAClD,eAAe,EAAE,MAAM;SACxB,EACD,OAAO,CAAC,KAAK,CACd,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACvC,UAAU,EAAE,QAAQ;SACrB,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -44,14 +44,19 @@ import type { ToolDefinition } from "./types.js";
44
44
  *
45
45
  * THE CREDENTIAL MOVES WITH IT, because the endpoints refuse each other's
46
46
  * tokens before any table is read: the singular path still authenticates with
47
- * `SPECGUARD_API_KEY` (`sgk_`, one repository), the plural path with
48
- * `SPECGUARD_AGENT_API_KEY` (`sga_`, the agent credential minted for exactly
49
- * this one key, many repositories, each read bounded by the key's own
50
- * granted set server-side). Omitting `repository` is byte-for-byte today's
51
- * request, and an operator who never sets the agent variable never sees this
52
- * half of the tool exist the blank-is-no-ask rule every argument here follows
53
- * covers `repository` too, so a blank value falls back to the singular path
54
- * rather than sending a guaranteed-404 id.
47
+ * `SPECGUARD_API_KEY` (`sgk_`, one repository), while the plural path answers
48
+ * with EITHER member credential, whichever is set — `SPECGUARD_AGENT_API_KEY`
49
+ * (`sga_`, the agent credential minted for exactly this: one key, many
50
+ * repositories, each read bounded by the key's own granted set server-side)
51
+ * preferred, and `SPECGUARD_USER_API_KEY` (`sgu_`, a person key whose
52
+ * accessible set is the boundary ids are resolved inside instead) when no
53
+ * agent key is set. With both set the agent key wins, so the plural answer
54
+ * stays inside the same set `list_repositories` reports — scope consistency,
55
+ * not preference. Omitting `repository` is byte-for-byte today's request, and
56
+ * an operator who sets neither member variable never sees this half of the
57
+ * tool exist — the blank-is-no-ask rule every argument here follows covers
58
+ * `repository` too, so a blank value falls back to the singular path rather
59
+ * than sending a guaranteed-404 id.
55
60
  *
56
61
  * == The response is passed through, not re-modelled
57
62
  *
@@ -1,5 +1,5 @@
1
- import { requireAgentApiConfig, requireApiConfig } from "../config.js";
2
- import { getJsonObject } from "../support/specguard-api.js";
1
+ import { requireApiConfig } from "../config.js";
2
+ import { getJsonObject, requireUserOrAgentApiConfig } from "../support/specguard-api.js";
3
3
  import { optionalBoolean, optionalString } from "./args.js";
4
4
  /**
5
5
  * `GET /api/v1/repository` as a tool — shipped today in the platform
@@ -46,14 +46,19 @@ import { optionalBoolean, optionalString } from "./args.js";
46
46
  *
47
47
  * THE CREDENTIAL MOVES WITH IT, because the endpoints refuse each other's
48
48
  * tokens before any table is read: the singular path still authenticates with
49
- * `SPECGUARD_API_KEY` (`sgk_`, one repository), the plural path with
50
- * `SPECGUARD_AGENT_API_KEY` (`sga_`, the agent credential minted for exactly
51
- * this one key, many repositories, each read bounded by the key's own
52
- * granted set server-side). Omitting `repository` is byte-for-byte today's
53
- * request, and an operator who never sets the agent variable never sees this
54
- * half of the tool exist the blank-is-no-ask rule every argument here follows
55
- * covers `repository` too, so a blank value falls back to the singular path
56
- * rather than sending a guaranteed-404 id.
49
+ * `SPECGUARD_API_KEY` (`sgk_`, one repository), while the plural path answers
50
+ * with EITHER member credential, whichever is set — `SPECGUARD_AGENT_API_KEY`
51
+ * (`sga_`, the agent credential minted for exactly this: one key, many
52
+ * repositories, each read bounded by the key's own granted set server-side)
53
+ * preferred, and `SPECGUARD_USER_API_KEY` (`sgu_`, a person key whose
54
+ * accessible set is the boundary ids are resolved inside instead) when no
55
+ * agent key is set. With both set the agent key wins, so the plural answer
56
+ * stays inside the same set `list_repositories` reports — scope consistency,
57
+ * not preference. Omitting `repository` is byte-for-byte today's request, and
58
+ * an operator who sets neither member variable never sees this half of the
59
+ * tool exist — the blank-is-no-ask rule every argument here follows covers
60
+ * `repository` too, so a blank value falls back to the singular path rather
61
+ * than sending a guaranteed-404 id.
57
62
  *
58
63
  * == The response is passed through, not re-modelled
59
64
  *
@@ -563,13 +568,20 @@ const getRepositoryOverview = {
563
568
  "with the endpoint: the call goes to GET /api/v1/repositories/:id — the plural surface, " +
564
569
  "the same overview body with every parameter above honoured identically, MINUS the " +
565
570
  "`api_key` block, which is ABSENT there rather than nulled (it describes the credential " +
566
- "that made the request, and this request was not made with a repository key) — under " +
567
- "SPECGUARD_AGENT_API_KEY, an sga_… agent key whose granted repository set is the read " +
568
- "boundary the id is looked up inside (a repository outside the set answers 404, " +
569
- "deliberately indistinguishable from a nonexistent one). SpecGuard refuses each credential " +
570
- "in the other's place before it reads anything, so naming `repository` without the agent " +
571
- "key or omitting it with only the agent key set is refused HERE, by name, before any " +
572
- "request is made. " +
571
+ "that made the request, and no member credential is a repository key) — and it " +
572
+ "authenticates with EITHER member credential, whichever is set: SPECGUARD_AGENT_API_KEY " +
573
+ "(an sga_… agent key the call then reaches only the repositories granted onto that key " +
574
+ "at mint time; a repository outside that set answers 404, deliberately indistinguishable " +
575
+ "from a nonexistent one) and, when that is not set, SPECGUARD_USER_API_KEY (an sgu_… key " +
576
+ "a PERSON key, whose accessible set is the boundary the id is resolved inside, exactly the " +
577
+ "set `list_repositories` reports under the same key). With both set the agent key wins, so " +
578
+ "the answer stays inside the set that key can act on. The server owns every refusal on this " +
579
+ "path — a repository outside the presented credential's grant answers 404 there, person " +
580
+ "and agent alike; SpecGuard refuses each credential KIND in the other's place, and the " +
581
+ "bridge refuses only the credential-less pairing, naming both member variables in one " +
582
+ "message. Omitting `repository` (or passing a blank) is byte-for-byte today's singular " +
583
+ "request, so an operator who sets neither member variable never sees this half of the tool " +
584
+ "exist. " +
573
585
  "Figures are null where CI did not report them — a null is 'not measured', never zero. That " +
574
586
  "rule is about NULLS and does not run backwards: a non-null figure is not thereby a " +
575
587
  "measurement. A run that reported zero tests serves a real `total_specs: 0` beside " +
@@ -586,20 +598,25 @@ const getRepositoryOverview = {
586
598
  "in `list_repositories` entries' `id` — not the `org/repo` handle: the plural endpoint " +
587
599
  "looks the id up inside the calling key's own read boundary, and a handle casts to no " +
588
600
  "id and answers 404. " +
589
- "The credential changes with it, because SpecGuard refuses each key kind in the " +
590
- "other's place: the call authenticates with SPECGUARD_AGENT_API_KEY (an sga_… agent " +
591
- "key) instead of SPECGUARD_API_KEY, and the set of repositories the agent key was " +
592
- "granted at mint time is the boundary the id is resolved inside a repository " +
593
- "outside the set answers 404, indistinguishable from one that does not exist, and " +
594
- "`list_repositories` under the same key lists exactly the set that is reachable. " +
601
+ "The credential changes with it: the call authenticates with EITHER member credential, " +
602
+ "whichever is set SPECGUARD_AGENT_API_KEY (an sga_… agent key; the set of " +
603
+ "repositories granted onto it at mint time is the boundary the id is resolved " +
604
+ "inside, and `list_repositories` under the same key lists exactly the set that is " +
605
+ "reachable) and, when that is not set, SPECGUARD_USER_API_KEY (an sgu_… key a " +
606
+ "PERSON key, whose accessible set is the boundary instead). With both set the " +
607
+ "agent key wins, so the answer stays inside the set that key can act on. SpecGuard " +
608
+ "refuses each credential KIND in the other's place: a repository outside the " +
609
+ "presented credential's grant answers 404, indistinguishable from one that does " +
610
+ "not exist — person and agent alike. " +
595
611
  "Every parameter means the same thing on either path: same ladder, same `run_anchor` " +
596
612
  "contract, same overview body with ONE difference this path owns — `api_key` is " +
597
613
  "ABSENT from the plural response, not null (the block describes the credential that " +
598
- "made the request, and an agent-key caller is not a repository key), so its absence " +
614
+ "made the request, and a member-key caller — agent or person — is not a repository " +
615
+ "key), so its absence " +
599
616
  "is the plural surface's shape, never a dropped key. " +
600
617
  "Omit it — or pass a blank — and the call is byte-for-byte the singular one: " +
601
618
  "SPECGUARD_API_KEY on GET /api/v1/repository, exactly as before this argument " +
602
- "existed, so an operator who never sets the agent key is unaffected.",
619
+ "existed, so an operator who sets neither member key is unaffected.",
603
620
  },
604
621
  branch: {
605
622
  type: "string",
@@ -870,17 +887,19 @@ const getRepositoryOverview = {
870
887
  // asked explicitly for it not to be. See this file's header.
871
888
  const unannotatedExamples = optionalBoolean(args["unannotated_examples"], "unannotated_examples");
872
889
  // WHICH ENDPOINT AND WHICH CREDENTIAL is decided here, once, from the one
873
- // ask: `repository` present means the plural surface under the agent key,
890
+ // ask: `repository` present means the plural surface under either member
891
+ // credential (the agent key preferred, the user key when no agent key is
892
+ // set — the SPGD-1106 widening; the route has served both since SPGD-952),
874
893
  // absent means the singular surface under the `sgk_` slot — byte-for-byte
875
894
  // the request this tool made before the argument existed. The two are kept
876
895
  // as one branch point rather than spread across the call below, so the
877
896
  // pair (path, credential) cannot be mixed: a plural path under the
878
- // repository key, or a singular path under the agent key, is a 401 at the
897
+ // repository key, or a singular path under a member key, is a 401 at the
879
898
  // deployment by design, and both mistakes are refused HERE, legibly,
880
899
  // instead.
881
900
  const api = repository === undefined
882
901
  ? requireApiConfig(context.config)
883
- : requireAgentApiConfig(context.config);
902
+ : requireUserOrAgentApiConfig(context.config);
884
903
  const path = repository === undefined
885
904
  ? "/api/v1/repository"
886
905
  : `/api/v1/repositories/${encodeURIComponent(repository)}`;
@@ -1 +1 @@
1
- {"version":3,"file":"repository-overview.js","sourceRoot":"","sources":["../../../src/tools/repository-overview.ts"],"names":[],"mappings":"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"}
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,aAAa,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAidG;AACH,MAAM,qBAAqB,GAAmB;IAC5C,IAAI,EAAE,yBAAyB;IAE/B,KAAK,EAAE,mCAAmC;IAE1C,WAAW,EACT,2FAA2F;QAC3F,6FAA6F;QAC7F,yFAAyF;QACzF,+FAA+F;QAC/F,8FAA8F;QAC9F,gEAAgE;QAChE,gGAAgG;QAChG,wFAAwF;QACxF,6FAA6F;QAC7F,4BAA4B;QAC5B,gFAAgF;QAChF,yFAAyF;QACzF,4FAA4F;QAC5F,qFAAqF;QACrF,yFAAyF;QACzF,yDAAyD;QACzD,4FAA4F;QAC5F,6FAA6F;QAC7F,kCAAkC;QAClC,6FAA6F;QAC7F,0FAA0F;QAC1F,wFAAwF;QACxF,yFAAyF;QACzF,4FAA4F;QAC5F,4DAA4D;QAC5D,+FAA+F;QAC/F,2FAA2F;QAC3F,gGAAgG;QAChG,wEAAwE;QACxE,6FAA6F;QAC7F,gGAAgG;QAChG,4EAA4E;QAC5E,+FAA+F;QAC/F,6FAA6F;QAC7F,0FAA0F;QAC1F,oFAAoF;QACpF,iGAAiG;QACjG,8FAA8F;QAC9F,2FAA2F;QAC3F,qEAAqE;QACrE,2FAA2F;QAC3F,kFAAkF;QAClF,iGAAiG;QACjG,gGAAgG;QAChG,yFAAyF;QACzF,gGAAgG;QAChG,8FAA8F;QAC9F,+FAA+F;QAC/F,uDAAuD;QACvD,yFAAyF;QACzF,8FAA8F;QAC9F,uFAAuF;QACvF,iEAAiE;QACjE,iGAAiG;QACjG,8FAA8F;QAC9F,eAAe;QACf,8FAA8F;QAC9F,8FAA8F;QAC9F,+FAA+F;QAC/F,4FAA4F;QAC5F,2FAA2F;QAC3F,0FAA0F;QAC1F,yFAAyF;QACzF,yBAAyB;QACzB,wFAAwF;QACxF,6FAA6F;QAC7F,sFAAsF;QACtF,8FAA8F;QAC9F,2FAA2F;QAC3F,4FAA4F;QAC5F,4FAA4F;QAC5F,0DAA0D;QAC1D,wFAAwF;QACxF,iFAAiF;QACjF,8FAA8F;QAC9F,yFAAyF;QACzF,6FAA6F;QAC7F,6FAA6F;QAC7F,qBAAqB;QACrB,mFAAmF;QACnF,+FAA+F;QAC/F,8FAA8F;QAC9F,4FAA4F;QAC5F,8FAA8F;QAC9F,8FAA8F;QAC9F,8FAA8F;QAC9F,yFAAyF;QACzF,+FAA+F;QAC/F,sDAAsD;QACtD,2FAA2F;QAC3F,oFAAoF;QACpF,4FAA4F;QAC5F,sEAAsE;QACtE,yFAAyF;QACzF,0FAA0F;QAC1F,yFAAyF;QACzF,oFAAoF;QACpF,yFAAyF;QACzF,gFAAgF;QAChF,yFAAyF;QACzF,0FAA0F;QAC1F,0FAA0F;QAC1F,4FAA4F;QAC5F,4FAA4F;QAC5F,4FAA4F;QAC5F,6FAA6F;QAC7F,yFAAyF;QACzF,wFAAwF;QACxF,uFAAuF;QACvF,wFAAwF;QACxF,4FAA4F;QAC5F,SAAS;QACT,6FAA6F;QAC7F,qFAAqF;QACrF,oFAAoF;QACpF,wFAAwF;QACxF,4FAA4F;IAE9F,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,sFAAsF;oBACtF,+EAA+E;oBAC/E,qFAAqF;oBACrF,wFAAwF;oBACxF,uFAAuF;oBACvF,sBAAsB;oBACtB,wFAAwF;oBACxF,6EAA6E;oBAC7E,+EAA+E;oBAC/E,mFAAmF;oBACnF,iFAAiF;oBACjF,+EAA+E;oBAC/E,oFAAoF;oBACpF,8EAA8E;oBAC9E,iFAAiF;oBACjF,sCAAsC;oBACtC,sFAAsF;oBACtF,iFAAiF;oBACjF,qFAAqF;oBACrF,oFAAoF;oBACpF,uBAAuB;oBACvB,sDAAsD;oBACtD,8EAA8E;oBAC9E,+EAA+E;oBAC/E,oEAAoE;aACvE;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,mFAAmF;oBACnF,uFAAuF;oBACvF,sFAAsF;oBACtF,qFAAqF;oBACrF,iFAAiF;oBACjF,kFAAkF;oBAClF,oFAAoF;oBACpF,yFAAyF;oBACzF,2FAA2F;oBAC3F,0FAA0F;oBAC1F,yEAAyE;aAC5E;YACD,cAAc,EAAE;gBACd,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,wFAAwF;oBACxF,yFAAyF;oBACzF,iEAAiE;oBACjE,sFAAsF;oBACtF,oFAAoF;oBACpF,sFAAsF;oBACtF,yFAAyF;oBACzF,0FAA0F;oBAC1F,2FAA2F;oBAC3F,qFAAqF;oBACrF,uFAAuF;oBACvF,qFAAqF;oBACrF,oBAAoB;oBACpB,0FAA0F;oBAC1F,0FAA0F;oBAC1F,wFAAwF;oBACxF,0FAA0F;oBAC1F,uFAAuF;oBACvF,qDAAqD;oBACrD,uFAAuF;oBACvF,0FAA0F;oBAC1F,sFAAsF;oBACtF,mDAAmD;aACtD;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,wFAAwF;oBACxF,oFAAoF;oBACpF,wDAAwD;oBACxD,uFAAuF;oBACvF,4EAA4E;oBAC5E,6EAA6E;oBAC7E,uFAAuF;oBACvF,sEAAsE;oBACtE,0FAA0F;oBAC1F,0FAA0F;oBAC1F,wCAAwC;oBACxC,uFAAuF;oBACvF,kFAAkF;oBAClF,uCAAuC;aAC1C;YACD,oBAAoB,EAAE;gBACpB,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,sFAAsF;oBACtF,wFAAwF;oBACxF,yDAAyD;oBACzD,mEAAmE;oBACnE,sFAAsF;oBACtF,oFAAoF;oBACpF,qFAAqF;oBACrF,uFAAuF;oBACvF,iFAAiF;oBACjF,oFAAoF;oBACpF,gFAAgF;oBAChF,yCAAyC;oBACzC,sFAAsF;oBACtF,kFAAkF;oBAClF,0CAA0C;aAC7C;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,wFAAwF;oBACxF,mFAAmF;oBACnF,sEAAsE;oBACtE,qFAAqF;oBACrF,uFAAuF;oBACvF,oFAAoF;oBACpF,yEAAyE;oBACzE,wFAAwF;oBACxF,iFAAiF;oBACjF,+BAA+B;oBAC/B,qFAAqF;oBACrF,qFAAqF;oBACrF,sFAAsF;oBACtF,mFAAmF;oBACnF,4EAA4E;oBAC5E,sFAAsF;oBACtF,YAAY;oBACZ,wFAAwF;oBACxF,oFAAoF;oBACpF,qFAAqF;oBACrF,uFAAuF;oBACvF,qFAAqF;oBACrF,qFAAqF;oBACrF,sFAAsF;oBACtF,2DAA2D;oBAC3D,sFAAsF;oBACtF,oFAAoF;oBACpF,kFAAkF;oBAClF,+BAA+B;oBAC/B,oFAAoF;oBACpF,uFAAuF;oBACvF,oFAAoF;oBACpF,SAAS;aACZ;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,wFAAwF;oBACxF,0FAA0F;oBAC1F,wFAAwF;oBACxF,8DAA8D;oBAC9D,qDAAqD;oBACrD,yDAAyD;oBACzD,sFAAsF;oBACtF,0EAA0E;oBAC1E,uFAAuF;oBACvF,0CAA0C;oBAC1C,mEAAmE;oBACnE,qFAAqF;oBACrF,+EAA+E;oBAC/E,mFAAmF;oBACnF,0FAA0F;oBAC1F,wFAAwF;oBACxF,yFAAyF;oBACzF,+BAA+B;oBAC/B,wFAAwF;oBACxF,yFAAyF;oBACzF,0FAA0F;oBAC1F,yFAAyF;oBACzF,yEAAyE;oBACzE,yFAAyF;oBACzF,yFAAyF;oBACzF,uFAAuF;oBACvF,sFAAsF;oBACtF,yFAAyF;oBACzF,wFAAwF;oBACxF,qFAAqF;oBACrF,uFAAuF;oBACvF,yFAAyF;oBACzF,sFAAsF;oBACtF,sFAAsF;oBACtF,yEAAyE;oBACzE,8EAA8E;oBAC9E,sFAAsF;oBACtF,uFAAuF;oBACvF,uFAAuF;oBACvF,SAAS;aACZ;YACD,oBAAoB,EAAE;gBACpB,IAAI,EAAE,SAAS;gBACf,WAAW,EACT,iFAAiF;oBACjF,sFAAsF;oBACtF,0FAA0F;oBAC1F,iFAAiF;oBACjF,yFAAyF;oBACzF,yFAAyF;oBACzF,6FAA6F;oBAC7F,uFAAuF;oBACvF,+EAA+E;oBAC/E,yFAAyF;oBACzF,0FAA0F;oBAC1F,oDAAoD;oBACpD,kFAAkF;oBAClF,2FAA2F;oBAC3F,0FAA0F;oBAC1F,sFAAsF;oBACtF,iCAAiC;oBACjC,0FAA0F;oBAC1F,2FAA2F;oBAC3F,sFAAsF;oBACtF,0FAA0F;oBAC1F,0FAA0F;oBAC1F,wFAAwF;oBACxF,wFAAwF;oBACxF,kCAAkC;oBAClC,oFAAoF;oBACpF,uFAAuF;oBACvF,0FAA0F;oBAC1F,yFAAyF;oBACzF,gEAAgE;oBAChE,uFAAuF;oBACvF,2DAA2D;oBAC3D,uFAAuF;oBACvF,uFAAuF;oBACvF,uFAAuF;oBACvF,+EAA+E;oBAC/E,wFAAwF;oBACxF,+DAA+D;oBAC/D,kFAAkF;oBAClF,wFAAwF;oBACxF,qFAAqF;oBACrF,uCAAuC;oBACvC,yFAAyF;oBACzF,yFAAyF;oBACzF,yFAAyF;oBACzF,sFAAsF;oBACtF,6CAA6C;oBAC7C,uFAAuF;oBACvF,oFAAoF;oBACpF,2FAA2F;oBAC3F,mGAAmG;oBACnG,wFAAwF;oBACxF,wFAAwF;oBACxF,yFAAyF;oBACzF,qFAAqF;oBACrF,2FAA2F;oBAC3F,2FAA2F;oBAC3F,yGAAyG;oBACzG,qFAAqF;oBACrF,sFAAsF;oBACtF,uFAAuF;oBACvF,wEAAwE;oBACxE,+EAA+E;oBAC/E,cAAc;oBACd,wFAAwF;oBACxF,+DAA+D;oBAC/D,0DAA0D;oBAC1D,uFAAuF;oBACvF,qFAAqF;oBACrF,uFAAuF;oBACvF,uFAAuF;oBACvF,2DAA2D;oBAC3D,0FAA0F;oBAC1F,0FAA0F;oBAC1F,sFAAsF;oBACtF,oFAAoF;oBACpF,0FAA0F;oBAC1F,0FAA0F;oBAC1F,yBAAyB;oBACzB,qFAAqF;oBACrF,6DAA6D;oBAC7D,wFAAwF;oBACxF,qFAAqF;oBACrF,uFAAuF;oBACvF,wFAAwF;oBACxF,0FAA0F;oBAC1F,yFAAyF;oBACzF,mCAAmC;oBACnC,qFAAqF;oBACrF,uFAAuF;oBACvF,gFAAgF;aACnF;SACF;QACD,oBAAoB,EAAE,KAAK;KAC5B;IAED,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO;QACrB,4EAA4E;QAC5E,wEAAwE;QACxE,uDAAuD;QACvD,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;QACxD,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAC/E,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;QAChE,MAAM,mBAAmB,GAAG,cAAc,CACxC,IAAI,CAAC,sBAAsB,CAAC,EAC5B,sBAAsB,CACvB,CAAC;QACF,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC,CAAC;QAC5E,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;QACnE,2EAA2E;QAC3E,6EAA6E;QAC7E,6EAA6E;QAC7E,wEAAwE;QACxE,6DAA6D;QAC7D,MAAM,mBAAmB,GAAG,eAAe,CACzC,IAAI,CAAC,sBAAsB,CAAC,EAC5B,sBAAsB,CACvB,CAAC;QACF,0EAA0E;QAC1E,yEAAyE;QACzE,yEAAyE;QACzE,2EAA2E;QAC3E,0EAA0E;QAC1E,2EAA2E;QAC3E,uEAAuE;QACvE,mEAAmE;QACnE,yEAAyE;QACzE,qEAAqE;QACrE,WAAW;QACX,MAAM,GAAG,GACP,UAAU,KAAK,SAAS;YACtB,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC;YAClC,CAAC,CAAC,2BAA2B,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,IAAI,GACR,UAAU,KAAK,SAAS;YACtB,CAAC,CAAC,oBAAoB;YACtB,CAAC,CAAC,wBAAwB,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;QAE/D,MAAM,QAAQ,GAAG,MAAM,aAAa,CAClC,GAAG,EACH,IAAI,EACJ;YACE,MAAM;YACN,cAAc,EAAE,aAAa;YAC7B,SAAS,EAAE,QAAQ;YACnB,oBAAoB,EAAE,mBAAmB;YACzC,aAAa,EAAE,YAAY;YAC3B,UAAU,EAAE,SAAS;YACrB,oBAAoB,EAAE,mBAAmB,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;SACxE,EACD,OAAO,CAAC,KAAK,CACd,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC;YAC1B,UAAU,EAAE,QAAQ;SACrB,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,qBAAqB,CAAC;AAErC;;;;;;;;;;;GAWG;AACH,SAAS,UAAU,CAAC,QAAiC;IACnD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specguard-mcp",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "description": "MCP server exposing SpecGuard suite intelligence to AI coding agents",
5
5
  "license": "ISC",
6
6
  "type": "module",