specguard-mcp 0.1.4 → 0.1.6
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 +150 -1
- package/dist/src/support/specguard-api.d.ts +19 -0
- package/dist/src/support/specguard-api.js +26 -0
- package/dist/src/support/specguard-api.js.map +1 -1
- package/dist/src/tools/add-repository-member.d.ts +31 -0
- package/dist/src/tools/add-repository-member.js +105 -0
- package/dist/src/tools/add-repository-member.js.map +1 -0
- package/dist/src/tools/args.d.ts +26 -0
- package/dist/src/tools/args.js +52 -0
- package/dist/src/tools/args.js.map +1 -1
- package/dist/src/tools/index.d.ts +53 -9
- package/dist/src/tools/index.js +65 -9
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/list-repository-members.d.ts +32 -0
- package/dist/src/tools/list-repository-members.js +76 -0
- package/dist/src/tools/list-repository-members.js.map +1 -0
- package/dist/src/tools/near-duplicate-clusters.d.ts +58 -0
- package/dist/src/tools/near-duplicate-clusters.js +116 -0
- package/dist/src/tools/near-duplicate-clusters.js.map +1 -0
- package/dist/src/tools/remove-repository-member.d.ts +30 -0
- package/dist/src/tools/remove-repository-member.js +93 -0
- package/dist/src/tools/remove-repository-member.js.map +1 -0
- package/dist/src/tools/rename-repository.d.ts +44 -0
- package/dist/src/tools/rename-repository.js +99 -0
- package/dist/src/tools/rename-repository.js.map +1 -0
- package/dist/src/tools/update-repository-member-permissions.d.ts +30 -0
- package/dist/src/tools/update-repository-member-permissions.js +97 -0
- package/dist/src/tools/update-repository-member-permissions.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { patchJsonObject, requireUserApiConfig } from "../support/specguard-api.js";
|
|
2
|
+
import { requireString } from "./args.js";
|
|
3
|
+
/**
|
|
4
|
+
* `PATCH /api/v1/repositories/:id` as a tool — shipped in the platform
|
|
5
|
+
* (`specguard/config/routes.rb:186`, `Api::V1::UserRepositoriesController#update`,
|
|
6
|
+
* SPGD-878, PR #266).
|
|
7
|
+
*
|
|
8
|
+
* == Why this tool exists at all
|
|
9
|
+
*
|
|
10
|
+
* Before it, the only way to change a repository's `org/repo` name through the
|
|
11
|
+
* bridge was `remove_repository` plus `add_repository` — which destroys every
|
|
12
|
+
* API key, every run and every intent on the repository, because that is what
|
|
13
|
+
* remove does. The platform's rename endpoint keeps all of it; this tool is
|
|
14
|
+
* the bridge's one-line path to that.
|
|
15
|
+
*
|
|
16
|
+
* == Authorization is OWNER-ONLY — deliberately narrower than delete
|
|
17
|
+
*
|
|
18
|
+
* The controller gates through `current_repository(:owner)`, NOT the
|
|
19
|
+
* `repo.delete` capability fork `remove_repository` authorizes through — so a
|
|
20
|
+
* member granted `repo.delete` may DESTROY the repository but may NOT rename
|
|
21
|
+
* it. The asymmetry is the platform's, and the description carries it rather
|
|
22
|
+
* than papering over it.
|
|
23
|
+
*
|
|
24
|
+
* == The grant precondition
|
|
25
|
+
*
|
|
26
|
+
* The owner check redeems a browser-issued grant that is valid for seven days;
|
|
27
|
+
* a nil or stale one is a 403 whose own sentence names the fix (re-grant via
|
|
28
|
+
* the browser). The bridge surfaces that sentence verbatim and adds no
|
|
29
|
+
* client-side grant handling — the server is the gate.
|
|
30
|
+
*
|
|
31
|
+
* == The body is top-level `{github_full_name}` — NOT nested
|
|
32
|
+
*
|
|
33
|
+
* `update_params` permits `github_full_name` at the TOP level, not under a
|
|
34
|
+
* `repository` key; a nested body is silently empty to the server. And a taken
|
|
35
|
+
* name is a 400 (`render_bad_request`, the `taken` branch), not a 409 — this
|
|
36
|
+
* description says so because it is the one answer an agent is most likely to
|
|
37
|
+
* mispredict.
|
|
38
|
+
*
|
|
39
|
+
* == The 200 body is the list_repositories shape
|
|
40
|
+
*
|
|
41
|
+
* `{repository: serialize(...)}` — the same serializer `list_repositories`
|
|
42
|
+
* serves, so the response needs no reshaping and gets none.
|
|
43
|
+
*/
|
|
44
|
+
const renameRepository = {
|
|
45
|
+
name: "rename_repository",
|
|
46
|
+
title: "Rename repository",
|
|
47
|
+
description: "Renames a SpecGuard repository — changes the `org/repo` GitHub full name it is registered " +
|
|
48
|
+
"under — WITHOUT destroying anything. This is the alternative to the remove-and-re-register " +
|
|
49
|
+
"path: that one deletes every API key, run and intent on the repository, while this keeps " +
|
|
50
|
+
"all of them. " +
|
|
51
|
+
"⚠️ Authorization is OWNER-ONLY — deliberately narrower than removal: a member granted " +
|
|
52
|
+
"`repo.delete` may destroy the repository but may NOT rename it. The owner check also " +
|
|
53
|
+
"redeems a browser-issued grant valid for 7 days; a nil or stale one is refused 403 in " +
|
|
54
|
+
"SpecGuard's own words, and that sentence names the fix (re-grant via the browser). " +
|
|
55
|
+
"A name another repository already holds is refused 400 — `taken`, not 409 — with " +
|
|
56
|
+
"SpecGuard's own sentence. The 200 body is `{repository: …}` in the same shape " +
|
|
57
|
+
"`list_repositories` serves. " +
|
|
58
|
+
"Takes `repository_id` — the numeric id `add_repository` returns and `list_repositories` " +
|
|
59
|
+
"reports, not the `org/repo` handle — and `github_full_name`, the new `org/repo` name. " +
|
|
60
|
+
"Needs SPECGUARD_USER_API_KEY (an sgu_… key), the same credential `add_repository` " +
|
|
61
|
+
"writes with and a DIFFERENT one from the sgk_… repository key `get_repository_overview` uses.",
|
|
62
|
+
inputSchema: {
|
|
63
|
+
type: "object",
|
|
64
|
+
properties: {
|
|
65
|
+
repository_id: {
|
|
66
|
+
type: "string",
|
|
67
|
+
description: "The id of the repository to rename — the numeric id `add_repository` returns and " +
|
|
68
|
+
"`list_repositories` reports, not the `org/repo` handle. SpecGuard scopes the lookup " +
|
|
69
|
+
"to repositories you own and answers 404 otherwise.",
|
|
70
|
+
},
|
|
71
|
+
github_full_name: {
|
|
72
|
+
type: "string",
|
|
73
|
+
description: "The repository's new GitHub full name, `org/repo` — sent TOP-LEVEL in the request " +
|
|
74
|
+
"body, not nested under `repository`. A name another repository already holds is " +
|
|
75
|
+
"refused 400 (`taken`).",
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
required: ["repository_id", "github_full_name"],
|
|
79
|
+
// Closed for the reason every tool here states: `server.ts` forwards
|
|
80
|
+
// `arguments` unvalidated, and a silently dropped misspelled argument on
|
|
81
|
+
// a WRITE must not be able to leave the agent believing it renamed to a
|
|
82
|
+
// name the call never carried.
|
|
83
|
+
additionalProperties: false,
|
|
84
|
+
},
|
|
85
|
+
async run(args, context) {
|
|
86
|
+
const repositoryId = requireString(args["repository_id"], "repository_id");
|
|
87
|
+
const githubFullName = requireString(args["github_full_name"], "github_full_name");
|
|
88
|
+
const api = requireUserApiConfig(context.config);
|
|
89
|
+
const updated = await patchJsonObject(api, `/api/v1/repositories/${encodeURIComponent(repositoryId)}`, { github_full_name: githubFullName }, context.fetch);
|
|
90
|
+
// Unreshaped, the standing rule — the 200 body (`{repository: serialize}` ,
|
|
91
|
+
// the `list_repositories` shape) is this verb's whole answer.
|
|
92
|
+
return {
|
|
93
|
+
text: JSON.stringify(updated, null, 2),
|
|
94
|
+
structured: updated,
|
|
95
|
+
};
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
export default renameRepository;
|
|
99
|
+
//# sourceMappingURL=rename-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rename-repository.js","sourceRoot":"","sources":["../../../src/tools/rename-repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,MAAM,gBAAgB,GAAmB;IACvC,IAAI,EAAE,mBAAmB;IACzB,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EACT,4FAA4F;QAC5F,6FAA6F;QAC7F,2FAA2F;QAC3F,eAAe;QACf,wFAAwF;QACxF,uFAAuF;QACvF,wFAAwF;QACxF,qFAAqF;QACrF,mFAAmF;QACnF,gFAAgF;QAChF,8BAA8B;QAC9B,0FAA0F;QAC1F,wFAAwF;QACxF,oFAAoF;QACpF,+FAA+F;IACjG,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,mFAAmF;oBACnF,sFAAsF;oBACtF,oDAAoD;aACvD;YACD,gBAAgB,EAAE;gBAChB,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,oFAAoF;oBACpF,kFAAkF;oBAClF,wBAAwB;aAC3B;SACF;QACD,QAAQ,EAAE,CAAC,eAAe,EAAE,kBAAkB,CAAC;QAC/C,qEAAqE;QACrE,yEAAyE;QACzE,wEAAwE;QACxE,+BAA+B;QAC/B,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;QAC3E,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAEnF,MAAM,GAAG,GAAG,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAG,MAAM,eAAe,CACnC,GAAG,EACH,wBAAwB,kBAAkB,CAAC,YAAY,CAAC,EAAE,EAC1D,EAAE,gBAAgB,EAAE,cAAc,EAAE,EACpC,OAAO,CAAC,KAAK,CACd,CAAC;QAEF,4EAA4E;QAC5E,8DAA8D;QAC9D,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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ToolDefinition } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* `PATCH /api/v1/repositories/:repository_id/members/:id` as a tool — shipped
|
|
4
|
+
* in the platform (`specguard/config/routes.rb`,
|
|
5
|
+
* `Api::V1::UserRepositoryMembersController#update`, SPGD-875).
|
|
6
|
+
*
|
|
7
|
+
* == The body is `{permissions: []}` and nothing else
|
|
8
|
+
*
|
|
9
|
+
* The controller permits exactly that one key, and the ARRAY form because the
|
|
10
|
+
* column is `text[]`: a scalar permit silently drops the array server-side.
|
|
11
|
+
* This tool therefore REQUIRES a string array — a scalar or nested value is
|
|
12
|
+
* refused client-side as a shape error before anything is sent.
|
|
13
|
+
*
|
|
14
|
+
* == The id is a MEMBERSHIP id, scoped to the repository
|
|
15
|
+
*
|
|
16
|
+
* `find_membership!` looks the row up THROUGH the repository, so a membership
|
|
17
|
+
* id belonging to a different repository is a 404, never a cross-repository
|
|
18
|
+
* write. The bridge adds no client-side check of that scoping: the server is
|
|
19
|
+
* the gate.
|
|
20
|
+
*
|
|
21
|
+
* == Known limitation: no endpoint serves the id
|
|
22
|
+
*
|
|
23
|
+
* `#serialize` deliberately omits the membership id from both the list and the
|
|
24
|
+
* 201 body, so an agent that adds a member has no machine-readable way to
|
|
25
|
+
* learn the id for this call. Today the id is obtained from the platform's web
|
|
26
|
+
* members page. That gap is a platform-side follow-up, not something this
|
|
27
|
+
* bridge can work around — there is no name-based lookup.
|
|
28
|
+
*/
|
|
29
|
+
declare const updateRepositoryMemberPermissions: ToolDefinition;
|
|
30
|
+
export default updateRepositoryMemberPermissions;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { patchJsonObject, requireUserApiConfig } from "../support/specguard-api.js";
|
|
2
|
+
import { requireString, requireStringArray } from "./args.js";
|
|
3
|
+
/**
|
|
4
|
+
* `PATCH /api/v1/repositories/:repository_id/members/:id` as a tool — shipped
|
|
5
|
+
* in the platform (`specguard/config/routes.rb`,
|
|
6
|
+
* `Api::V1::UserRepositoryMembersController#update`, SPGD-875).
|
|
7
|
+
*
|
|
8
|
+
* == The body is `{permissions: []}` and nothing else
|
|
9
|
+
*
|
|
10
|
+
* The controller permits exactly that one key, and the ARRAY form because the
|
|
11
|
+
* column is `text[]`: a scalar permit silently drops the array server-side.
|
|
12
|
+
* This tool therefore REQUIRES a string array — a scalar or nested value is
|
|
13
|
+
* refused client-side as a shape error before anything is sent.
|
|
14
|
+
*
|
|
15
|
+
* == The id is a MEMBERSHIP id, scoped to the repository
|
|
16
|
+
*
|
|
17
|
+
* `find_membership!` looks the row up THROUGH the repository, so a membership
|
|
18
|
+
* id belonging to a different repository is a 404, never a cross-repository
|
|
19
|
+
* write. The bridge adds no client-side check of that scoping: the server is
|
|
20
|
+
* the gate.
|
|
21
|
+
*
|
|
22
|
+
* == Known limitation: no endpoint serves the id
|
|
23
|
+
*
|
|
24
|
+
* `#serialize` deliberately omits the membership id from both the list and the
|
|
25
|
+
* 201 body, so an agent that adds a member has no machine-readable way to
|
|
26
|
+
* learn the id for this call. Today the id is obtained from the platform's web
|
|
27
|
+
* members page. That gap is a platform-side follow-up, not something this
|
|
28
|
+
* bridge can work around — there is no name-based lookup.
|
|
29
|
+
*/
|
|
30
|
+
const updateRepositoryMemberPermissions = {
|
|
31
|
+
name: "update_repository_member_permissions",
|
|
32
|
+
title: "Update repository member permissions",
|
|
33
|
+
description: "Replaces one member's permission set on a SpecGuard repository. The member is named by " +
|
|
34
|
+
"`member_id` — a MEMBERSHIP id, not a user id — and the id is SCOPED to `repository_id`: " +
|
|
35
|
+
"a membership id belonging to a different repository is refused 404, never a " +
|
|
36
|
+
"cross-repository write. " +
|
|
37
|
+
"⚠️ `permissions` REPLACES the whole set — it is not merged with what the member holds " +
|
|
38
|
+
"today, so name every permission the member should end with. Values are strings from " +
|
|
39
|
+
"SpecGuard's own set (`view`, `keys.manage`, `members.manage`, `repo.delete`); an unknown " +
|
|
40
|
+
"value is refused in SpecGuard's own words. " +
|
|
41
|
+
"KNOWN LIMITATION: no API endpoint serves the membership id — the member list and the " +
|
|
42
|
+
"add-member response both omit it by design — so the id must be obtained from the " +
|
|
43
|
+
"platform (today via the repository's web members page); there is no name-based lookup. " +
|
|
44
|
+
"Authorization is the `members.manage` capability — a member without it is refused 403 in " +
|
|
45
|
+
"SpecGuard's own words. " +
|
|
46
|
+
"Takes `repository_id` — the numeric id `list_repositories` reports, not the `org/repo` " +
|
|
47
|
+
"handle. " +
|
|
48
|
+
"Needs SPECGUARD_USER_API_KEY (an sgu_… key), the same credential `add_repository` " +
|
|
49
|
+
"writes with and a DIFFERENT one from the sgk_… repository key `get_repository_overview` uses.",
|
|
50
|
+
inputSchema: {
|
|
51
|
+
type: "object",
|
|
52
|
+
properties: {
|
|
53
|
+
repository_id: {
|
|
54
|
+
type: "string",
|
|
55
|
+
description: "The repository the membership belongs to — its numeric id, as `add_repository` " +
|
|
56
|
+
"returns and `list_repositories` reports, not the `org/repo` handle.",
|
|
57
|
+
},
|
|
58
|
+
member_id: {
|
|
59
|
+
type: "string",
|
|
60
|
+
description: "The id of the MEMBERSHIP row to edit — not a user id, and not the handle. Scoped " +
|
|
61
|
+
"to `repository_id`: a foreign membership id is refused 404. No API endpoint serves " +
|
|
62
|
+
"this id today; obtain it from the platform's web members page.",
|
|
63
|
+
},
|
|
64
|
+
permissions: {
|
|
65
|
+
type: "array",
|
|
66
|
+
items: { type: "string" },
|
|
67
|
+
description: "The member's COMPLETE new permission set, replacing what they hold today — e.g. " +
|
|
68
|
+
"[\"view\", \"keys.manage\"]. Not merged. An empty array removes every additional " +
|
|
69
|
+
"permission while keeping the membership.",
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
required: ["repository_id", "member_id", "permissions"],
|
|
73
|
+
// Closed for the reason every tool here states — and on a WRITE that
|
|
74
|
+
// REPLACES a permission set, a silently dropped misspelled argument must
|
|
75
|
+
// not be able to leave the agent believing it granted a permission the
|
|
76
|
+
// call never carried.
|
|
77
|
+
additionalProperties: false,
|
|
78
|
+
},
|
|
79
|
+
async run(args, context) {
|
|
80
|
+
const repositoryId = requireString(args["repository_id"], "repository_id");
|
|
81
|
+
const memberId = requireString(args["member_id"], "member_id");
|
|
82
|
+
// REQUIRED, and required as an ARRAY: the server column is `text[]` and a
|
|
83
|
+
// scalar on the wire is silently dropped server-side, so the shape error is
|
|
84
|
+
// caught here — before a write — rather than persisted as a member holding
|
|
85
|
+
// nothing.
|
|
86
|
+
const permissions = requireStringArray(args["permissions"], "permissions");
|
|
87
|
+
const api = requireUserApiConfig(context.config);
|
|
88
|
+
const updated = await patchJsonObject(api, `/api/v1/repositories/${encodeURIComponent(repositoryId)}/members/${encodeURIComponent(memberId)}`, { permissions }, context.fetch);
|
|
89
|
+
// Unreshaped, the standing rule — the 200 body is this verb's whole answer.
|
|
90
|
+
return {
|
|
91
|
+
text: JSON.stringify(updated, null, 2),
|
|
92
|
+
structured: updated,
|
|
93
|
+
};
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
export default updateRepositoryMemberPermissions;
|
|
97
|
+
//# sourceMappingURL=update-repository-member-permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-repository-member-permissions.js","sourceRoot":"","sources":["../../../src/tools/update-repository-member-permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAG9D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,iCAAiC,GAAmB;IACxD,IAAI,EAAE,sCAAsC;IAC5C,KAAK,EAAE,sCAAsC;IAC7C,WAAW,EACT,yFAAyF;QACzF,0FAA0F;QAC1F,8EAA8E;QAC9E,0BAA0B;QAC1B,wFAAwF;QACxF,sFAAsF;QACtF,2FAA2F;QAC3F,6CAA6C;QAC7C,uFAAuF;QACvF,mFAAmF;QACnF,yFAAyF;QACzF,2FAA2F;QAC3F,yBAAyB;QACzB,yFAAyF;QACzF,UAAU;QACV,oFAAoF;QACpF,+FAA+F;IACjG,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,iFAAiF;oBACjF,qEAAqE;aACxE;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,mFAAmF;oBACnF,qFAAqF;oBACrF,gEAAgE;aACnE;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EACT,kFAAkF;oBAClF,mFAAmF;oBACnF,0CAA0C;aAC7C;SACF;QACD,QAAQ,EAAE,CAAC,eAAe,EAAE,WAAW,EAAE,aAAa,CAAC;QACvD,qEAAqE;QACrE,yEAAyE;QACzE,uEAAuE;QACvE,sBAAsB;QACtB,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;QAC3E,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;QAC/D,0EAA0E;QAC1E,4EAA4E;QAC5E,2EAA2E;QAC3E,WAAW;QACX,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC,CAAC;QAE3E,MAAM,GAAG,GAAG,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAG,MAAM,eAAe,CACnC,GAAG,EACH,wBAAwB,kBAAkB,CAAC,YAAY,CAAC,YAAY,kBAAkB,CAAC,QAAQ,CAAC,EAAE,EAClG,EAAE,WAAW,EAAE,EACf,OAAO,CAAC,KAAK,CACd,CAAC;QAEF,4EAA4E;QAC5E,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,iCAAiC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specguard-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "MCP server exposing SpecGuard suite intelligence to AI coding agents",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"type": "module",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/node": "^20.19.0",
|
|
31
|
+
"specguard-ts": "github:yatfa-ai/specguard-ts",
|
|
31
32
|
"typescript": "^5.6.0"
|
|
32
33
|
},
|
|
33
34
|
"repository": {
|