specky-sdd 3.10.2 → 3.11.0
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/.apm/agents/specky-design-architect.agent.md +1 -1
- package/.apm/agents/specky-implementer.agent.md +2 -2
- package/.apm/agents/specky-onboarding.agent.md +2 -2
- package/.apm/agents/specky-orchestrator.agent.md +2 -2
- package/.apm/agents/specky-quality-reviewer.agent.md +1 -1
- package/.apm/agents/specky-release-engineer.agent.md +6 -5
- package/.apm/agents/specky-requirements-engineer.agent.md +1 -1
- package/.apm/agents/specky-research-analyst.agent.md +1 -1
- package/.apm/agents/specky-sdd-clarify.agent.md +1 -1
- package/.apm/agents/specky-sdd-init.agent.md +2 -2
- package/.apm/agents/specky-spec-engineer.agent.md +1 -1
- package/.apm/agents/specky-task-planner.agent.md +1 -1
- package/.apm/agents/specky-test-verifier.agent.md +7 -6
- package/CHANGELOG.md +15 -0
- package/README.md +5 -5
- package/SECURITY.md +5 -1
- package/apm-policy.yml +2 -0
- package/apm.lock.yaml +16 -16
- package/apm.yml +3 -3
- package/config.yml +4 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +49 -19
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +93 -5
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/lib/apm/policy.d.ts +1 -0
- package/dist/cli/lib/apm/policy.d.ts.map +1 -1
- package/dist/cli/lib/apm/policy.js +15 -0
- package/dist/cli/lib/apm/policy.js.map +1 -1
- package/dist/cli/lib/asset-copier.d.ts +1 -0
- package/dist/cli/lib/asset-copier.d.ts.map +1 -1
- package/dist/cli/lib/asset-copier.js +4 -4
- package/dist/cli/lib/asset-copier.js.map +1 -1
- package/dist/cli/lib/harness/compilers/claude.js +3 -3
- package/dist/cli/lib/harness/compilers/claude.js.map +1 -1
- package/dist/cli/lib/harness/compilers/common.d.ts +10 -1
- package/dist/cli/lib/harness/compilers/common.d.ts.map +1 -1
- package/dist/cli/lib/harness/compilers/common.js +71 -8
- package/dist/cli/lib/harness/compilers/common.js.map +1 -1
- package/dist/cli/lib/harness/compilers/copilot.js +3 -3
- package/dist/cli/lib/harness/compilers/copilot.js.map +1 -1
- package/dist/cli/lib/harness/compilers/cursor.js +3 -3
- package/dist/cli/lib/harness/compilers/cursor.js.map +1 -1
- package/dist/cli/lib/harness/compilers/opencode.js +3 -3
- package/dist/cli/lib/harness/compilers/opencode.js.map +1 -1
- package/dist/cli/lib/harness/tool-map.d.ts +8 -1
- package/dist/cli/lib/harness/tool-map.d.ts.map +1 -1
- package/dist/cli/lib/harness/tool-map.js +74 -0
- package/dist/cli/lib/harness/tool-map.js.map +1 -1
- package/dist/cli/lib/harness/types.d.ts +11 -1
- package/dist/cli/lib/harness/types.d.ts.map +1 -1
- package/dist/cli/lib/mcp-writer.d.ts +2 -1
- package/dist/cli/lib/mcp-writer.d.ts.map +1 -1
- package/dist/cli/lib/mcp-writer.js +13 -5
- package/dist/cli/lib/mcp-writer.js.map +1 -1
- package/dist/cli/lib/settings-merger.d.ts +15 -0
- package/dist/cli/lib/settings-merger.d.ts.map +1 -1
- package/dist/cli/lib/settings-merger.js +66 -1
- package/dist/cli/lib/settings-merger.js.map +1 -1
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +12 -4
- package/dist/config.js.map +1 -1
- package/package.json +10 -1
|
@@ -2,15 +2,24 @@
|
|
|
2
2
|
* harness/compilers/common.ts — shared frontmatter/tool-line helpers used by
|
|
3
3
|
* every harness compiler.
|
|
4
4
|
*/
|
|
5
|
-
import type { HarnessTarget } from "../types.js";
|
|
5
|
+
import type { AgentCapability, HarnessCompileOptions, HarnessTarget } from "../types.js";
|
|
6
6
|
export declare function unique(values: string[]): string[];
|
|
7
7
|
export declare function normalizeNewlines(text: string): string;
|
|
8
8
|
export declare function stripYamlFrontmatter(content: string): string;
|
|
9
9
|
/** Parse a frontmatter `tools:` value that is a JSON array or a comma list. */
|
|
10
10
|
export declare function parseToolArray(tools: string): string[];
|
|
11
|
+
/** Parse the canonical `capabilities:` frontmatter value. */
|
|
12
|
+
export declare function parseCapabilityArray(capabilities: string): AgentCapability[];
|
|
13
|
+
/** Extract canonical capabilities from an agent source file, if present. */
|
|
14
|
+
export declare function agentCapabilities(content: string): AgentCapability[];
|
|
11
15
|
/**
|
|
12
16
|
* Rewrite the `tools:` frontmatter line for a target harness, mapping each
|
|
13
17
|
* source token to its native token(s) and serializing in the harness's format.
|
|
14
18
|
*/
|
|
15
19
|
export declare function transformToolsLine(content: string, target: HarnessTarget, format: "json-array" | "comma-list"): string;
|
|
20
|
+
/**
|
|
21
|
+
* Compile canonical `capabilities:` into a target-native `tools:` line.
|
|
22
|
+
* Legacy canonical `tools:` remains supported while agents migrate.
|
|
23
|
+
*/
|
|
24
|
+
export declare function transformAgentTools(content: string, target: HarnessTarget, format: "json-array" | "comma-list", opts?: HarnessCompileOptions): string;
|
|
16
25
|
//# sourceMappingURL=common.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../../../src/cli/lib/harness/compilers/common.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../../../src/cli/lib/harness/compilers/common.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGzF,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEjD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AA0BD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBtD;AAED,6DAA6D;AAC7D,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,eAAe,EAAE,CAO5E;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,CAOpE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,YAAY,GAAG,YAAY,GACpC,MAAM,CAUR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,YAAY,GAAG,YAAY,EACnC,IAAI,GAAE,qBAA0B,GACjC,MAAM,CAoBR"}
|
|
@@ -2,12 +2,34 @@
|
|
|
2
2
|
* harness/compilers/common.ts — shared frontmatter/tool-line helpers used by
|
|
3
3
|
* every harness compiler.
|
|
4
4
|
*/
|
|
5
|
-
import { mapTool } from "../tool-map.js";
|
|
5
|
+
import { capabilityToNative, isAgentCapability, mapTool } from "../tool-map.js";
|
|
6
6
|
export function unique(values) {
|
|
7
7
|
return [...new Set(values.filter(Boolean))];
|
|
8
8
|
}
|
|
9
9
|
export function normalizeNewlines(text) {
|
|
10
|
-
return text.
|
|
10
|
+
return text.replaceAll("\r\n", "\n");
|
|
11
|
+
}
|
|
12
|
+
function frontmatterValue(content, key) {
|
|
13
|
+
const prefix = `${key}:`;
|
|
14
|
+
return normalizeNewlines(content)
|
|
15
|
+
.split("\n")
|
|
16
|
+
.find((line) => line.startsWith(prefix))
|
|
17
|
+
?.slice(prefix.length)
|
|
18
|
+
.trim();
|
|
19
|
+
}
|
|
20
|
+
function replaceFrontmatterLine(content, key, replacement) {
|
|
21
|
+
const prefix = `${key}:`;
|
|
22
|
+
let replaced = false;
|
|
23
|
+
return normalizeNewlines(content)
|
|
24
|
+
.split("\n")
|
|
25
|
+
.map((line) => {
|
|
26
|
+
if (!replaced && line.startsWith(prefix)) {
|
|
27
|
+
replaced = true;
|
|
28
|
+
return replacement;
|
|
29
|
+
}
|
|
30
|
+
return line;
|
|
31
|
+
})
|
|
32
|
+
.join("\n");
|
|
11
33
|
}
|
|
12
34
|
export function stripYamlFrontmatter(content) {
|
|
13
35
|
return normalizeNewlines(content).replace(/^---\n[\s\S]*?\n---\n/, "");
|
|
@@ -34,16 +56,57 @@ export function parseToolArray(tools) {
|
|
|
34
56
|
.map((token) => token.trim().replace(/^"|"$/g, ""))
|
|
35
57
|
.filter(Boolean);
|
|
36
58
|
}
|
|
59
|
+
/** Parse the canonical `capabilities:` frontmatter value. */
|
|
60
|
+
export function parseCapabilityArray(capabilities) {
|
|
61
|
+
const values = parseToolArray(capabilities);
|
|
62
|
+
const unknown = values.filter((value) => !isAgentCapability(value));
|
|
63
|
+
if (unknown.length > 0) {
|
|
64
|
+
throw new Error(`Unknown agent capability: ${unknown.join(", ")}`);
|
|
65
|
+
}
|
|
66
|
+
return values;
|
|
67
|
+
}
|
|
68
|
+
/** Extract canonical capabilities from an agent source file, if present. */
|
|
69
|
+
export function agentCapabilities(content) {
|
|
70
|
+
const rawCapabilities = frontmatterValue(content, "capabilities");
|
|
71
|
+
if (rawCapabilities === undefined)
|
|
72
|
+
return [];
|
|
73
|
+
if (frontmatterValue(content, "tools") !== undefined) {
|
|
74
|
+
throw new Error("Canonical agent frontmatter must declare either capabilities or tools, not both.");
|
|
75
|
+
}
|
|
76
|
+
return parseCapabilityArray(rawCapabilities);
|
|
77
|
+
}
|
|
37
78
|
/**
|
|
38
79
|
* Rewrite the `tools:` frontmatter line for a target harness, mapping each
|
|
39
80
|
* source token to its native token(s) and serializing in the harness's format.
|
|
40
81
|
*/
|
|
41
82
|
export function transformToolsLine(content, target, format) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
83
|
+
const rawTools = frontmatterValue(content, "tools");
|
|
84
|
+
if (rawTools === undefined)
|
|
85
|
+
return content;
|
|
86
|
+
const mapped = unique(parseToolArray(rawTools).flatMap((token) => mapTool(token, target)));
|
|
87
|
+
const tools = format === "comma-list"
|
|
88
|
+
? `tools: ${mapped.join(", ")}`
|
|
89
|
+
: `tools: ${JSON.stringify(mapped)}`;
|
|
90
|
+
return replaceFrontmatterLine(content, "tools", tools);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Compile canonical `capabilities:` into a target-native `tools:` line.
|
|
94
|
+
* Legacy canonical `tools:` remains supported while agents migrate.
|
|
95
|
+
*/
|
|
96
|
+
export function transformAgentTools(content, target, format, opts = {}) {
|
|
97
|
+
const capabilities = agentCapabilities(content);
|
|
98
|
+
if (capabilities.length === 0)
|
|
99
|
+
return transformToolsLine(content, target, format);
|
|
100
|
+
if (target === "agent-skills") {
|
|
101
|
+
throw new Error("Agent Skills is a skills-only target and cannot compile agents.");
|
|
102
|
+
}
|
|
103
|
+
const enabledIntegrations = new Set(opts.integrations ?? []);
|
|
104
|
+
const mapped = unique(capabilities
|
|
105
|
+
.filter((capability) => !capability.startsWith("mcp.github.") || enabledIntegrations.has("github"))
|
|
106
|
+
.flatMap((capability) => capabilityToNative(capability, target)));
|
|
107
|
+
const tools = format === "comma-list"
|
|
108
|
+
? `tools: ${mapped.join(", ")}`
|
|
109
|
+
: `tools: ${JSON.stringify(mapped)}`;
|
|
110
|
+
return replaceFrontmatterLine(content, "capabilities", tools);
|
|
48
111
|
}
|
|
49
112
|
//# sourceMappingURL=common.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../../src/cli/lib/harness/compilers/common.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../../src/cli/lib/harness/compilers/common.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
* `edit`/`fetch` and namespaced `specky/sdd_*` MCP tools, and `agent: agent`
|
|
6
6
|
* prompt frontmatter.
|
|
7
7
|
*/
|
|
8
|
-
import {
|
|
8
|
+
import { transformAgentTools } from "./common.js";
|
|
9
9
|
export const copilotCompiler = {
|
|
10
10
|
target: "copilot",
|
|
11
|
-
compileAgent(content) {
|
|
12
|
-
return
|
|
11
|
+
compileAgent(content, opts) {
|
|
12
|
+
return transformAgentTools(content, "copilot", "json-array", opts);
|
|
13
13
|
},
|
|
14
14
|
compilePrompt(content) {
|
|
15
15
|
// `.apm` prompts already use `agent: agent`; keep them and drop any stray
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../../../src/cli/lib/harness/compilers/copilot.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../../../src/cli/lib/harness/compilers/copilot.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC5C,MAAM,EAAE,SAAS;IAEjB,YAAY,CAAC,OAAO,EAAE,IAAI;QACtB,OAAO,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;IACvE,CAAC;IAED,aAAa,CAAC,OAAO;QACjB,0EAA0E;QAC1E,uEAAuE;QACvE,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAC;IAClE,CAAC;IAED,kBAAkB,CAAC,OAAO;QACtB,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,WAAW,CAAC,QAAQ;QAChB,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,YAAY,CAAC,QAAQ;QACjB,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ,CAAC"}
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
* form: `.cursor/agents/*.md`, `.cursor/commands/*.md`, comma-list `tools:`
|
|
4
4
|
* compatible with Cursor's Claude-like command/agent surface, and `.mdc` rules.
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
6
|
+
import { transformAgentTools, stripYamlFrontmatter } from "./common.js";
|
|
7
7
|
export const cursorCompiler = {
|
|
8
8
|
target: "cursor",
|
|
9
|
-
compileAgent(content) {
|
|
10
|
-
return
|
|
9
|
+
compileAgent(content, opts) {
|
|
10
|
+
return transformAgentTools(content, "cursor", "comma-list", opts);
|
|
11
11
|
},
|
|
12
12
|
compilePrompt(content) {
|
|
13
13
|
return content
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../../../src/cli/lib/harness/compilers/cursor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../../../src/cli/lib/harness/compilers/cursor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExE,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC3C,MAAM,EAAE,QAAQ;IAEhB,YAAY,CAAC,OAAO,EAAE,IAAI;QACtB,OAAO,mBAAmB,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,aAAa,CAAC,OAAO;QACjB,OAAO,OAAO;aACT,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC;aACpC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,kBAAkB,CAAC,OAAO;QACtB,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC3C,OAAO,wEAAwE,IAAI,EAAE,CAAC;IAC1F,CAAC;IAED,WAAW,CAAC,QAAQ;QAChB,OAAO,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,YAAY,CAAC,QAAQ;QACjB,OAAO,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;CACJ,CAAC"}
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
* harness/compilers/opencode.ts — renders canonical primitives into OpenCode
|
|
3
3
|
* native form: `.opencode/agents/*.md` and `.opencode/commands/*.md`.
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
5
|
+
import { transformAgentTools } from "./common.js";
|
|
6
6
|
export const opencodeCompiler = {
|
|
7
7
|
target: "opencode",
|
|
8
|
-
compileAgent(content) {
|
|
9
|
-
return
|
|
8
|
+
compileAgent(content, opts) {
|
|
9
|
+
return transformAgentTools(content, "opencode", "comma-list", opts);
|
|
10
10
|
},
|
|
11
11
|
compilePrompt(content) {
|
|
12
12
|
return content
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../../../src/cli/lib/harness/compilers/opencode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../../../src/cli/lib/harness/compilers/opencode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC7C,MAAM,EAAE,UAAU;IAElB,YAAY,CAAC,OAAO,EAAE,IAAI;QACtB,OAAO,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;IACxE,CAAC;IAED,aAAa,CAAC,OAAO;QACjB,OAAO,OAAO;aACT,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC;aACpC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,kBAAkB,CAAC,OAAO;QACtB,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,WAAW,CAAC,QAAQ;QAChB,OAAO,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,YAAY,CAAC,QAAQ;QACjB,OAAO,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;CACJ,CAAC"}
|
|
@@ -5,9 +5,16 @@
|
|
|
5
5
|
* harness's native tool tokens. Copilot and Claude outputs produced here are
|
|
6
6
|
* byte-for-byte identical to the legacy inline transforms in asset-copier.ts.
|
|
7
7
|
*/
|
|
8
|
-
import type { HarnessTarget, LogicalTool } from "./types.js";
|
|
8
|
+
import type { AgentCapability, HarnessTarget, LogicalTool } from "./types.js";
|
|
9
9
|
/** Fold any known native/source token into a canonical logical tool id. */
|
|
10
10
|
export declare function normalizeToLogical(token: string): LogicalTool;
|
|
11
|
+
/** Return whether a value is an allowed canonical agent capability. */
|
|
12
|
+
export declare function isAgentCapability(value: string): value is AgentCapability;
|
|
13
|
+
/**
|
|
14
|
+
* Render a canonical agent capability to target-native tool tokens.
|
|
15
|
+
* Agent Skills is intentionally excluded because it installs skills only.
|
|
16
|
+
*/
|
|
17
|
+
export declare function capabilityToNative(capability: AgentCapability, target: Exclude<HarnessTarget, "agent-skills">): string[];
|
|
11
18
|
/** Render a logical tool id into the native token(s) for a harness. */
|
|
12
19
|
export declare function logicalToNative(logical: LogicalTool, target: HarnessTarget): string[];
|
|
13
20
|
/** Map a single source/native token to the native token(s) for a harness. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-map.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/harness/tool-map.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-map.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/harness/tool-map.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9E,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAsC7D;AA0HD,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,eAAe,CAKzE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAC9B,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,GAC/C,MAAM,EAAE,CAWV;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAC3B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,aAAa,GACtB,MAAM,EAAE,CAQV;AAED,6EAA6E;AAC7E,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAEtE"}
|
|
@@ -90,6 +90,56 @@ const NATIVE = {
|
|
|
90
90
|
"agent-skills": ["todo.write"],
|
|
91
91
|
},
|
|
92
92
|
};
|
|
93
|
+
const CAPABILITY_NATIVE = {
|
|
94
|
+
"workspace.read": {
|
|
95
|
+
copilot: ["search"],
|
|
96
|
+
claude: ["Read", "Glob", "Grep"],
|
|
97
|
+
cursor: ["Read", "Glob", "Grep"],
|
|
98
|
+
opencode: ["read"],
|
|
99
|
+
},
|
|
100
|
+
"workspace.edit": {
|
|
101
|
+
copilot: ["edit"],
|
|
102
|
+
claude: ["Edit", "Write", "MultiEdit"],
|
|
103
|
+
cursor: ["Edit", "Write", "MultiEdit"],
|
|
104
|
+
opencode: ["edit"],
|
|
105
|
+
},
|
|
106
|
+
"workspace.command.git": {
|
|
107
|
+
copilot: ["runCommands"],
|
|
108
|
+
claude: ["Bash"],
|
|
109
|
+
cursor: ["Bash"],
|
|
110
|
+
opencode: ["bash"],
|
|
111
|
+
},
|
|
112
|
+
"workspace.command.test": {
|
|
113
|
+
copilot: ["runCommands"],
|
|
114
|
+
claude: ["Bash"],
|
|
115
|
+
cursor: ["Bash"],
|
|
116
|
+
opencode: ["bash"],
|
|
117
|
+
},
|
|
118
|
+
"workspace.command.release-gates": {
|
|
119
|
+
copilot: ["runCommands"],
|
|
120
|
+
claude: ["Bash"],
|
|
121
|
+
cursor: ["Bash"],
|
|
122
|
+
opencode: ["bash"],
|
|
123
|
+
},
|
|
124
|
+
"web.fetch": {
|
|
125
|
+
copilot: ["fetch"],
|
|
126
|
+
claude: ["WebFetch", "WebSearch"],
|
|
127
|
+
cursor: ["WebFetch", "WebSearch"],
|
|
128
|
+
opencode: ["fetch"],
|
|
129
|
+
},
|
|
130
|
+
"agent.delegate": {
|
|
131
|
+
copilot: ["agent"],
|
|
132
|
+
claude: ["Task"],
|
|
133
|
+
cursor: ["Task"],
|
|
134
|
+
opencode: ["agent"],
|
|
135
|
+
},
|
|
136
|
+
"todo.write": {
|
|
137
|
+
copilot: ["todos"],
|
|
138
|
+
claude: ["TodoWrite"],
|
|
139
|
+
cursor: ["TodoWrite"],
|
|
140
|
+
opencode: ["todo"],
|
|
141
|
+
},
|
|
142
|
+
};
|
|
93
143
|
function speckyMcpToken(tool, target) {
|
|
94
144
|
if (target === "claude" || target === "cursor")
|
|
95
145
|
return `mcp__specky__${tool}`;
|
|
@@ -97,6 +147,30 @@ function speckyMcpToken(tool, target) {
|
|
|
97
147
|
return tool;
|
|
98
148
|
return `specky/${tool}`;
|
|
99
149
|
}
|
|
150
|
+
function mcpToken(server, tool, target) {
|
|
151
|
+
if (target === "claude" || target === "cursor")
|
|
152
|
+
return `mcp__${server}__${tool}`;
|
|
153
|
+
return `${server}/${tool}`;
|
|
154
|
+
}
|
|
155
|
+
/** Return whether a value is an allowed canonical agent capability. */
|
|
156
|
+
export function isAgentCapability(value) {
|
|
157
|
+
return (value in CAPABILITY_NATIVE ||
|
|
158
|
+
/^mcp\.(specky|github)\.[a-z][a-z0-9_]*$/.test(value));
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Render a canonical agent capability to target-native tool tokens.
|
|
162
|
+
* Agent Skills is intentionally excluded because it installs skills only.
|
|
163
|
+
*/
|
|
164
|
+
export function capabilityToNative(capability, target) {
|
|
165
|
+
if (!isAgentCapability(capability)) {
|
|
166
|
+
throw new Error(`Unknown agent capability "${capability}".`);
|
|
167
|
+
}
|
|
168
|
+
if (capability.startsWith("mcp.")) {
|
|
169
|
+
const [, server, ...toolParts] = capability.split(".");
|
|
170
|
+
return [mcpToken(server, toolParts.join("."), target)];
|
|
171
|
+
}
|
|
172
|
+
return CAPABILITY_NATIVE[capability][target];
|
|
173
|
+
}
|
|
100
174
|
/** Render a logical tool id into the native token(s) for a harness. */
|
|
101
175
|
export function logicalToNative(logical, target) {
|
|
102
176
|
if (logical.startsWith(MCP_PREFIX)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-map.js","sourceRoot":"","sources":["../../../../src/cli/lib/harness/tool-map.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tool-map.js","sourceRoot":"","sources":["../../../../src/cli/lib/harness/tool-map.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,UAAU,GAAG,aAAa,CAAC;AACjC,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B,2EAA2E;AAC3E,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC5C,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,GAAG,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;IAC3D,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,OAAO,GAAG,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;IACjE,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,GAAG,UAAU,GAAG,KAAK,EAAE,CAAC;IACnC,CAAC;IAED,QAAQ,KAAK,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ;YACT,OAAO,kBAAkB,CAAC;QAC9B,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,WAAW,CAAC;QACjB,KAAK,MAAM;YACP,OAAO,gBAAgB,CAAC;QAC5B,KAAK,MAAM,CAAC;QACZ,KAAK,aAAa;YACd,OAAO,mBAAmB,CAAC;QAC/B,KAAK,UAAU,CAAC;QAChB,KAAK,WAAW,CAAC;QACjB,KAAK,OAAO;YACR,OAAO,WAAW,CAAC;QACvB,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO;YACR,OAAO,gBAAgB,CAAC;QAC5B,KAAK,WAAW,CAAC;QACjB,KAAK,OAAO;YACR,OAAO,YAAY,CAAC;QACxB;YACI,OAAO,GAAG,UAAU,GAAG,KAAK,EAAE,CAAC;IACvC,CAAC;AACL,CAAC;AAOD,MAAM,MAAM,GAA8D;IACtE,kBAAkB,EAAE;QAChB,OAAO,EAAE,CAAC,QAAQ,CAAC;QACnB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QAChC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QAChC,QAAQ,EAAE,CAAC,MAAM,CAAC;QAClB,cAAc,EAAE,CAAC,kBAAkB,CAAC;KACvC;IACD,gBAAgB,EAAE;QACd,OAAO,EAAE,CAAC,MAAM,CAAC;QACjB,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC;QACtC,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC;QACtC,QAAQ,EAAE,CAAC,MAAM,CAAC;QAClB,cAAc,EAAE,CAAC,gBAAgB,CAAC;KACrC;IACD,mBAAmB,EAAE;QACjB,OAAO,EAAE,CAAC,aAAa,CAAC;QACxB,MAAM,EAAE,CAAC,MAAM,CAAC;QAChB,MAAM,EAAE,CAAC,MAAM,CAAC;QAChB,QAAQ,EAAE,CAAC,MAAM,CAAC;QAClB,cAAc,EAAE,CAAC,mBAAmB,CAAC;KACxC;IACD,WAAW,EAAE;QACT,OAAO,EAAE,CAAC,OAAO,CAAC;QAClB,MAAM,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC;QACjC,MAAM,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC;QACjC,QAAQ,EAAE,CAAC,OAAO,CAAC;QACnB,cAAc,EAAE,CAAC,WAAW,CAAC;KAChC;IACD,gBAAgB,EAAE;QACd,OAAO,EAAE,CAAC,OAAO,CAAC;QAClB,MAAM,EAAE,CAAC,MAAM,CAAC;QAChB,MAAM,EAAE,CAAC,MAAM,CAAC;QAChB,QAAQ,EAAE,CAAC,OAAO,CAAC;QACnB,cAAc,EAAE,CAAC,gBAAgB,CAAC;KACrC;IACD,YAAY,EAAE;QACV,OAAO,EAAE,CAAC,OAAO,CAAC;QAClB,MAAM,EAAE,CAAC,WAAW,CAAC;QACrB,MAAM,EAAE,CAAC,WAAW,CAAC;QACrB,QAAQ,EAAE,CAAC,MAAM,CAAC;QAClB,cAAc,EAAE,CAAC,YAAY,CAAC;KACjC;CACJ,CAAC;AAOF,MAAM,iBAAiB,GAGnB;IACA,gBAAgB,EAAE;QACd,OAAO,EAAE,CAAC,QAAQ,CAAC;QACnB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QAChC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QAChC,QAAQ,EAAE,CAAC,MAAM,CAAC;KACrB;IACD,gBAAgB,EAAE;QACd,OAAO,EAAE,CAAC,MAAM,CAAC;QACjB,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC;QACtC,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC;QACtC,QAAQ,EAAE,CAAC,MAAM,CAAC;KACrB;IACD,uBAAuB,EAAE;QACrB,OAAO,EAAE,CAAC,aAAa,CAAC;QACxB,MAAM,EAAE,CAAC,MAAM,CAAC;QAChB,MAAM,EAAE,CAAC,MAAM,CAAC;QAChB,QAAQ,EAAE,CAAC,MAAM,CAAC;KACrB;IACD,wBAAwB,EAAE;QACtB,OAAO,EAAE,CAAC,aAAa,CAAC;QACxB,MAAM,EAAE,CAAC,MAAM,CAAC;QAChB,MAAM,EAAE,CAAC,MAAM,CAAC;QAChB,QAAQ,EAAE,CAAC,MAAM,CAAC;KACrB;IACD,iCAAiC,EAAE;QAC/B,OAAO,EAAE,CAAC,aAAa,CAAC;QACxB,MAAM,EAAE,CAAC,MAAM,CAAC;QAChB,MAAM,EAAE,CAAC,MAAM,CAAC;QAChB,QAAQ,EAAE,CAAC,MAAM,CAAC;KACrB;IACD,WAAW,EAAE;QACT,OAAO,EAAE,CAAC,OAAO,CAAC;QAClB,MAAM,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC;QACjC,MAAM,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC;QACjC,QAAQ,EAAE,CAAC,OAAO,CAAC;KACtB;IACD,gBAAgB,EAAE;QACd,OAAO,EAAE,CAAC,OAAO,CAAC;QAClB,MAAM,EAAE,CAAC,MAAM,CAAC;QAChB,MAAM,EAAE,CAAC,MAAM,CAAC;QAChB,QAAQ,EAAE,CAAC,OAAO,CAAC;KACtB;IACD,YAAY,EAAE;QACV,OAAO,EAAE,CAAC,OAAO,CAAC;QAClB,MAAM,EAAE,CAAC,WAAW,CAAC;QACrB,MAAM,EAAE,CAAC,WAAW,CAAC;QACrB,QAAQ,EAAE,CAAC,MAAM,CAAC;KACrB;CACJ,CAAC;AAEF,SAAS,cAAc,CAAC,IAAY,EAAE,MAAqB;IACvD,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,gBAAgB,IAAI,EAAE,CAAC;IAC9E,IAAI,MAAM,KAAK,cAAc;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,UAAU,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,QAAQ,CAAC,MAA2B,EAAE,IAAY,EAAE,MAA8C;IACvG,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,QAAQ,MAAM,KAAK,IAAI,EAAE,CAAC;IACjF,OAAO,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC3C,OAAO,CACH,KAAK,IAAI,iBAAiB;QAC1B,yCAAyC,CAAC,IAAI,CAAC,KAAK,CAAC,CACxD,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAC9B,UAA2B,EAC3B,MAA8C;IAE9C,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,6BAA6B,UAAU,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvD,OAAO,CAAC,QAAQ,CAAC,MAA6B,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,iBAAiB,CAAC,UAA6B,CAAC,CAAC,MAAM,CAAC,CAAC;AACpE,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,eAAe,CAC3B,OAAoB,EACpB,MAAqB;IAErB,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,MAAM,CAAC,OAA2B,CAAC,CAAC,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,MAAqB;IACxD,OAAO,eAAe,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -21,6 +21,16 @@ export type HarnessTarget = "copilot" | "claude" | "cursor" | "opencode" | "agen
|
|
|
21
21
|
* logical id back into the tokens a specific harness understands.
|
|
22
22
|
*/
|
|
23
23
|
export type LogicalTool = "workspace.search" | "workspace.edit" | "workspace.command" | "web.fetch" | "agent.delegate" | "todo.write" | `mcp.specky.${string}` | `raw:${string}`;
|
|
24
|
+
/**
|
|
25
|
+
* Canonical agent capability vocabulary. Canonical `.apm` agents declare
|
|
26
|
+
* capabilities; compilers render them into the target's native tool tokens.
|
|
27
|
+
* Command subtypes retain the least-privilege intent needed by host-specific
|
|
28
|
+
* permission profiles while sharing one native command tool per harness.
|
|
29
|
+
*/
|
|
30
|
+
export type AgentCapability = "workspace.read" | "workspace.edit" | "workspace.command.git" | "workspace.command.test" | "workspace.command.release-gates" | "web.fetch" | "agent.delegate" | "todo.write" | `mcp.specky.${string}` | `mcp.github.${string}`;
|
|
31
|
+
export interface HarnessCompileOptions {
|
|
32
|
+
integrations?: readonly string[];
|
|
33
|
+
}
|
|
24
34
|
/**
|
|
25
35
|
* A compiler renders canonical primitive files into one harness's native
|
|
26
36
|
* form. Content transforms operate on raw file text (frontmatter + body);
|
|
@@ -29,7 +39,7 @@ export type LogicalTool = "workspace.search" | "workspace.edit" | "workspace.com
|
|
|
29
39
|
export interface HarnessCompiler {
|
|
30
40
|
readonly target: HarnessTarget;
|
|
31
41
|
/** Transform an agent markdown file (frontmatter `tools:` line, etc.). */
|
|
32
|
-
compileAgent(content: string): string;
|
|
42
|
+
compileAgent(content: string, opts?: HarnessCompileOptions): string;
|
|
33
43
|
/** Transform a prompt/command markdown file. */
|
|
34
44
|
compilePrompt(content: string): string;
|
|
35
45
|
/** Transform an instruction/rules markdown file. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/harness/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACnB,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,cAAc,CAAC;AAErB;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,mBAAmB,GACnB,WAAW,GACX,gBAAgB,GAChB,YAAY,GACZ,cAAc,MAAM,EAAE,GACtB,OAAO,MAAM,EAAE,CAAC;AAEtB;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,0EAA0E;IAC1E,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/harness/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACnB,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,cAAc,CAAC;AAErB;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,mBAAmB,GACnB,WAAW,GACX,gBAAgB,GAChB,YAAY,GACZ,cAAc,MAAM,EAAE,GACtB,OAAO,MAAM,EAAE,CAAC;AAEtB;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GACrB,gBAAgB,GAChB,gBAAgB,GAChB,uBAAuB,GACvB,wBAAwB,GACxB,iCAAiC,GACjC,WAAW,GACX,gBAAgB,GAChB,YAAY,GACZ,cAAc,MAAM,EAAE,GACtB,cAAc,MAAM,EAAE,CAAC;AAE7B,MAAM,WAAW,qBAAqB;IAClC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,0EAA0E;IAC1E,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,qBAAqB,GAAG,MAAM,CAAC;IACpE,gDAAgD;IAChD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACvC,oDAAoD;IACpD,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5C,uEAAuE;IACvE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,uEAAuE;IACvE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1C"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export type ManagedMcpServer = "specky" | "github";
|
|
1
2
|
/**
|
|
2
3
|
* Merge a Specky server entry into the given MCP config file.
|
|
3
4
|
* - VS Code mcp.json uses `{ "servers": { ... } }` (new schema) or
|
|
@@ -6,7 +7,7 @@
|
|
|
6
7
|
*/
|
|
7
8
|
export declare function writeMcpRegistration(path: string, opts: {
|
|
8
9
|
dryRun: boolean;
|
|
9
|
-
serverName?:
|
|
10
|
+
serverName?: ManagedMcpServer;
|
|
10
11
|
useVscodeSchema?: boolean;
|
|
11
12
|
useOpenCodeSchema?: boolean;
|
|
12
13
|
}): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-writer.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/mcp-writer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp-writer.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/mcp-writer.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AA2CnD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IACJ,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GACA;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAA;CAAE,CA0BhF"}
|
|
@@ -10,10 +10,17 @@ import { VERSION } from "../../constants.js";
|
|
|
10
10
|
// Pin to the version that produced this install rather than `@latest`, so the
|
|
11
11
|
// running server matches the assets on disk and a future npm release cannot be
|
|
12
12
|
// auto-executed on the next session without an explicit `specky upgrade`.
|
|
13
|
-
const
|
|
13
|
+
const SPECKY_SERVER = {
|
|
14
14
|
command: "npx",
|
|
15
15
|
args: ["-y", `specky-sdd@${VERSION}`, "serve"],
|
|
16
16
|
};
|
|
17
|
+
const GITHUB_SERVER = {
|
|
18
|
+
type: "http",
|
|
19
|
+
url: "https://api.githubcopilot.com/mcp/",
|
|
20
|
+
};
|
|
21
|
+
function managedServerEntry(server) {
|
|
22
|
+
return server === "github" ? GITHUB_SERVER : SPECKY_SERVER;
|
|
23
|
+
}
|
|
17
24
|
function readJson(path) {
|
|
18
25
|
if (!existsSync(path))
|
|
19
26
|
return {};
|
|
@@ -41,21 +48,22 @@ function writeJson(path, data, dryRun) {
|
|
|
41
48
|
*/
|
|
42
49
|
export function writeMcpRegistration(path, opts) {
|
|
43
50
|
const name = opts.serverName ?? "specky";
|
|
51
|
+
const server = managedServerEntry(name);
|
|
44
52
|
const existing = readJson(path);
|
|
45
53
|
const before = JSON.stringify(existing);
|
|
46
54
|
if (opts.useOpenCodeSchema) {
|
|
47
55
|
existing.mcp = existing.mcp ?? {};
|
|
48
|
-
existing.mcp[name] =
|
|
56
|
+
existing.mcp[name] = server;
|
|
49
57
|
}
|
|
50
58
|
else if (opts.useVscodeSchema) {
|
|
51
59
|
existing.servers = existing.servers ?? {};
|
|
52
|
-
existing.servers[name] =
|
|
60
|
+
existing.servers[name] = server;
|
|
53
61
|
existing.mcpServers = existing.mcpServers ?? {};
|
|
54
|
-
existing.mcpServers[name] =
|
|
62
|
+
existing.mcpServers[name] = server;
|
|
55
63
|
}
|
|
56
64
|
else {
|
|
57
65
|
existing.mcpServers = existing.mcpServers ?? {};
|
|
58
|
-
existing.mcpServers[name] =
|
|
66
|
+
existing.mcpServers[name] = server;
|
|
59
67
|
}
|
|
60
68
|
const after = JSON.stringify(existing);
|
|
61
69
|
if (before === after) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-writer.js","sourceRoot":"","sources":["../../../src/cli/lib/mcp-writer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-writer.js","sourceRoot":"","sources":["../../../src/cli/lib/mcp-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { resolve } from "node:path";
|
|
2
|
+
import type { AgentCapability } from "./harness/types.js";
|
|
2
3
|
import type { Targets } from "./paths.js";
|
|
4
|
+
export type PermissionProfile = "prompt" | "scoped";
|
|
3
5
|
interface HookEntry {
|
|
4
6
|
type: string;
|
|
5
7
|
command: string;
|
|
@@ -30,6 +32,15 @@ interface HooksSection {
|
|
|
30
32
|
* `.claude/settings.json` explicitly.
|
|
31
33
|
*/
|
|
32
34
|
export declare const SPECKY_REQUIRED_ALLOWS: string[];
|
|
35
|
+
/**
|
|
36
|
+
* Compute the narrowest Claude allowlist that can satisfy installed agent
|
|
37
|
+
* capabilities. The prompt profile deliberately leaves host confirmation on.
|
|
38
|
+
*/
|
|
39
|
+
export declare function requiredClaudeAllows(capabilities: Iterable<AgentCapability>, opts: {
|
|
40
|
+
profile: PermissionProfile;
|
|
41
|
+
workspace: string;
|
|
42
|
+
integrations?: readonly string[];
|
|
43
|
+
}): string[];
|
|
33
44
|
export interface MergeResult {
|
|
34
45
|
written: boolean;
|
|
35
46
|
path: string;
|
|
@@ -38,6 +49,10 @@ export interface MergeResult {
|
|
|
38
49
|
}
|
|
39
50
|
export declare function mergeClaudeHooks(targets: Targets, claudeHooks: HooksSection, opts: {
|
|
40
51
|
dryRun: boolean;
|
|
52
|
+
capabilities?: Iterable<AgentCapability>;
|
|
53
|
+
integrations?: readonly string[];
|
|
54
|
+
permissionProfile?: PermissionProfile;
|
|
55
|
+
workspace?: string;
|
|
41
56
|
}): MergeResult;
|
|
42
57
|
export declare function loadClaudeHooksManifest(manifestPath: string): HooksSection;
|
|
43
58
|
export { resolve };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-merger.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/settings-merger.ts"],"names":[],"mappings":"AAOA,OAAO,EAAW,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,UAAU,YAAY;IACpB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC;CAC9B;AAgBD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,EAiB1C,CAAC;
|
|
1
|
+
{"version":3,"file":"settings-merger.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/settings-merger.ts"],"names":[],"mappings":"AAOA,OAAO,EAAW,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEpD,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,UAAU,YAAY;IACpB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC;CAC9B;AAgBD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,EAiB1C,CAAC;AAYF;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,EACvC,IAAI,EAAE;IACJ,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC,GACA,MAAM,EAAE,CA2CV;AA8CD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AA0BD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,YAAY,EACzB,IAAI,EAAE;IACJ,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IACzC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,WAAW,CAgCb;AAED,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,YAAY,CAS1E;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -41,6 +41,64 @@ export const SPECKY_REQUIRED_ALLOWS = [
|
|
|
41
41
|
// All Specky MCP tools
|
|
42
42
|
"mcp__specky__*",
|
|
43
43
|
];
|
|
44
|
+
function testRunnerAllows(workspace) {
|
|
45
|
+
const allows = ["Bash(npm:*)", "Bash(npx:*)"];
|
|
46
|
+
if (existsSync(resolve(workspace, "pnpm-lock.yaml")))
|
|
47
|
+
allows.push("Bash(pnpm:*)");
|
|
48
|
+
if (existsSync(resolve(workspace, "yarn.lock")))
|
|
49
|
+
allows.push("Bash(yarn:*)");
|
|
50
|
+
if (existsSync(resolve(workspace, "bun.lockb")) || existsSync(resolve(workspace, "bun.lock"))) {
|
|
51
|
+
allows.push("Bash(bun:*)");
|
|
52
|
+
}
|
|
53
|
+
return allows;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Compute the narrowest Claude allowlist that can satisfy installed agent
|
|
57
|
+
* capabilities. The prompt profile deliberately leaves host confirmation on.
|
|
58
|
+
*/
|
|
59
|
+
export function requiredClaudeAllows(capabilities, opts) {
|
|
60
|
+
if (opts.profile === "prompt")
|
|
61
|
+
return [];
|
|
62
|
+
const allows = new Set();
|
|
63
|
+
const integrations = new Set(opts.integrations ?? []);
|
|
64
|
+
for (const capability of capabilities) {
|
|
65
|
+
switch (capability) {
|
|
66
|
+
case "workspace.read":
|
|
67
|
+
allows.add("Read");
|
|
68
|
+
allows.add("Glob");
|
|
69
|
+
allows.add("Grep");
|
|
70
|
+
break;
|
|
71
|
+
case "workspace.edit":
|
|
72
|
+
allows.add("Edit");
|
|
73
|
+
allows.add("Write");
|
|
74
|
+
allows.add("MultiEdit");
|
|
75
|
+
break;
|
|
76
|
+
case "agent.delegate":
|
|
77
|
+
allows.add("Task");
|
|
78
|
+
break;
|
|
79
|
+
case "workspace.command.git":
|
|
80
|
+
allows.add("Bash(git:*)");
|
|
81
|
+
break;
|
|
82
|
+
case "workspace.command.test":
|
|
83
|
+
for (const allow of testRunnerAllows(opts.workspace))
|
|
84
|
+
allows.add(allow);
|
|
85
|
+
break;
|
|
86
|
+
case "workspace.command.release-gates":
|
|
87
|
+
allows.add("Bash(.claude/hooks/scripts/specky-security-scan.sh:*)");
|
|
88
|
+
allows.add("Bash(.claude/hooks/scripts/specky-release-gate.sh:*)");
|
|
89
|
+
break;
|
|
90
|
+
default:
|
|
91
|
+
if (capability.startsWith("mcp.specky.")) {
|
|
92
|
+
allows.add(`mcp__specky__${capability.slice("mcp.specky.".length)}`);
|
|
93
|
+
}
|
|
94
|
+
if (integrations.has("github") &&
|
|
95
|
+
capability.startsWith("mcp.github.")) {
|
|
96
|
+
allows.add(`mcp__github__${capability.slice("mcp.github.".length)}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return [...allows].sort((left, right) => left.localeCompare(right));
|
|
101
|
+
}
|
|
44
102
|
function readSettings(path) {
|
|
45
103
|
if (!existsSync(path))
|
|
46
104
|
return {};
|
|
@@ -107,7 +165,14 @@ export function mergeClaudeHooks(targets, claudeHooks, opts) {
|
|
|
107
165
|
const existing = readSettings(path);
|
|
108
166
|
const mergedHooks = mergeHooks(existing.hooks ?? {}, claudeHooks);
|
|
109
167
|
const addedEvents = Object.keys(mergedHooks).filter((k) => !existing.hooks || !existing.hooks[k]);
|
|
110
|
-
const
|
|
168
|
+
const requiredAllows = opts.capabilities
|
|
169
|
+
? requiredClaudeAllows(opts.capabilities, {
|
|
170
|
+
profile: opts.permissionProfile ?? "scoped",
|
|
171
|
+
workspace: opts.workspace ?? process.cwd(),
|
|
172
|
+
integrations: opts.integrations,
|
|
173
|
+
})
|
|
174
|
+
: SPECKY_REQUIRED_ALLOWS;
|
|
175
|
+
const { merged: mergedPerms, added: addedPermissions } = mergePermissions(existing.permissions, requiredAllows);
|
|
111
176
|
const final = {
|
|
112
177
|
...existing,
|
|
113
178
|
hooks: mergedHooks,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-merger.js","sourceRoot":"","sources":["../../../src/cli/lib/settings-merger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"settings-merger.js","sourceRoot":"","sources":["../../../src/cli/lib/settings-merger.ts"],"names":[],"mappings":"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"}
|