specky-sdd 3.7.2 → 3.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.md +4 -0
  3. package/apm-policy.yml +41 -0
  4. package/apm.lock.yaml +71 -0
  5. package/apm.yml +29 -2
  6. package/dist/cli/commands/apm.d.ts +2 -0
  7. package/dist/cli/commands/apm.d.ts.map +1 -0
  8. package/dist/cli/commands/apm.js +139 -0
  9. package/dist/cli/commands/apm.js.map +1 -0
  10. package/dist/cli/index.js +10 -1
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/cli/lib/apm/lock.d.ts +23 -0
  13. package/dist/cli/lib/apm/lock.d.ts.map +1 -0
  14. package/dist/cli/lib/apm/lock.js +90 -0
  15. package/dist/cli/lib/apm/lock.js.map +1 -0
  16. package/dist/cli/lib/apm/manifest.d.ts +31 -0
  17. package/dist/cli/lib/apm/manifest.d.ts.map +1 -0
  18. package/dist/cli/lib/apm/manifest.js +65 -0
  19. package/dist/cli/lib/apm/manifest.js.map +1 -0
  20. package/dist/cli/lib/apm/policy.d.ts +23 -0
  21. package/dist/cli/lib/apm/policy.d.ts.map +1 -0
  22. package/dist/cli/lib/apm/policy.js +85 -0
  23. package/dist/cli/lib/apm/policy.js.map +1 -0
  24. package/dist/cli/lib/asset-copier.d.ts.map +1 -1
  25. package/dist/cli/lib/asset-copier.js +8 -126
  26. package/dist/cli/lib/asset-copier.js.map +1 -1
  27. package/dist/cli/lib/harness/compilers/claude.d.ts +10 -0
  28. package/dist/cli/lib/harness/compilers/claude.d.ts.map +1 -0
  29. package/dist/cli/lib/harness/compilers/claude.js +29 -0
  30. package/dist/cli/lib/harness/compilers/claude.js.map +1 -0
  31. package/dist/cli/lib/harness/compilers/common.d.ts +14 -0
  32. package/dist/cli/lib/harness/compilers/common.d.ts.map +1 -0
  33. package/dist/cli/lib/harness/compilers/common.js +43 -0
  34. package/dist/cli/lib/harness/compilers/common.js.map +1 -0
  35. package/dist/cli/lib/harness/compilers/copilot.d.ts +10 -0
  36. package/dist/cli/lib/harness/compilers/copilot.d.ts.map +1 -0
  37. package/dist/cli/lib/harness/compilers/copilot.js +32 -0
  38. package/dist/cli/lib/harness/compilers/copilot.js.map +1 -0
  39. package/dist/cli/lib/harness/index.d.ts +12 -0
  40. package/dist/cli/lib/harness/index.d.ts.map +1 -0
  41. package/dist/cli/lib/harness/index.js +18 -0
  42. package/dist/cli/lib/harness/index.js.map +1 -0
  43. package/dist/cli/lib/harness/tool-map.d.ts +15 -0
  44. package/dist/cli/lib/harness/tool-map.d.ts.map +1 -0
  45. package/dist/cli/lib/harness/tool-map.js +92 -0
  46. package/dist/cli/lib/harness/tool-map.js.map +1 -0
  47. package/dist/cli/lib/harness/types.d.ts +42 -0
  48. package/dist/cli/lib/harness/types.d.ts.map +1 -0
  49. package/dist/cli/lib/harness/types.js +12 -0
  50. package/dist/cli/lib/harness/types.js.map +1 -0
  51. package/dist/cli/lib/paths.d.ts +1 -0
  52. package/dist/cli/lib/paths.d.ts.map +1 -1
  53. package/dist/cli/lib/paths.js +1 -0
  54. package/dist/cli/lib/paths.js.map +1 -1
  55. package/package.json +5 -3
@@ -0,0 +1,65 @@
1
+ /**
2
+ * apm/manifest.ts — load and validate the APM manifest (apm.yml).
3
+ *
4
+ * The manifest is the enterprise contract for the package: it declares the
5
+ * canonical primitive source, the harness targets the package compiles to, and
6
+ * the MCP servers that back the primitives' tool ids. `apm validate` checks the
7
+ * manifest against the on-disk primitives and the npm manifest (package.json).
8
+ */
9
+ import { readFileSync, existsSync } from "node:fs";
10
+ import { resolve } from "node:path";
11
+ import { parse } from "yaml";
12
+ import { sourcePaths } from "../paths.js";
13
+ export function loadManifest(pkgRoot) {
14
+ const { apmYml } = sourcePaths(pkgRoot);
15
+ if (!existsSync(apmYml)) {
16
+ throw new Error(`[specky] apm.yml not found at ${apmYml}`);
17
+ }
18
+ return parse(readFileSync(apmYml, "utf8"));
19
+ }
20
+ /**
21
+ * Validate the APM manifest: required fields, version parity with
22
+ * package.json, declared primitive paths exist, targets are non-empty, and at
23
+ * least one MCP server is declared.
24
+ */
25
+ export function validateManifest(pkgRoot) {
26
+ const errors = [];
27
+ const warnings = [];
28
+ let manifest;
29
+ try {
30
+ manifest = loadManifest(pkgRoot);
31
+ }
32
+ catch (err) {
33
+ return { ok: false, errors: [err.message], warnings };
34
+ }
35
+ const pkg = JSON.parse(readFileSync(resolve(pkgRoot, "package.json"), "utf8"));
36
+ if (!manifest.name)
37
+ errors.push("apm.yml: missing 'name'");
38
+ else if (manifest.name !== pkg.name) {
39
+ errors.push(`apm.yml name "${manifest.name}" != package.json name "${pkg.name}"`);
40
+ }
41
+ if (!manifest.version)
42
+ errors.push("apm.yml: missing 'version'");
43
+ else if (manifest.version !== pkg.version) {
44
+ errors.push(`apm.yml version "${manifest.version}" != package.json version "${pkg.version}"`);
45
+ }
46
+ if (!Array.isArray(manifest.targets) || manifest.targets.length === 0) {
47
+ errors.push("apm.yml: 'targets' must list at least one harness target");
48
+ }
49
+ if (!manifest.primitives || typeof manifest.primitives !== "object") {
50
+ errors.push("apm.yml: missing 'primitives' map");
51
+ }
52
+ else {
53
+ for (const [kind, relPath] of Object.entries(manifest.primitives)) {
54
+ if (!existsSync(resolve(pkgRoot, relPath))) {
55
+ errors.push(`apm.yml: primitive '${kind}' path does not exist: ${relPath}`);
56
+ }
57
+ }
58
+ }
59
+ const servers = manifest.mcp?.servers ?? [];
60
+ if (servers.length === 0) {
61
+ warnings.push("apm.yml: no MCP servers declared under 'mcp.servers'");
62
+ }
63
+ return { ok: errors.length === 0, errors, warnings };
64
+ }
65
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../../src/cli/lib/apm/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export interface ApmPolicy {
2
+ schemaVersion?: number;
3
+ allowedSources?: string[];
4
+ mcp?: {
5
+ allowTransitive?: boolean;
6
+ allowedServers?: string[];
7
+ };
8
+ hooks?: {
9
+ allowedEvents?: string[];
10
+ };
11
+ targets?: Record<string, {
12
+ forbidToolTokens?: string[];
13
+ }>;
14
+ }
15
+ export declare function policyPath(pkgRoot: string): string;
16
+ export declare function loadPolicy(pkgRoot: string): ApmPolicy;
17
+ export interface PolicyResult {
18
+ ok: boolean;
19
+ errors: string[];
20
+ warnings: string[];
21
+ }
22
+ export declare function checkPolicy(pkgRoot: string): PolicyResult;
23
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/apm/policy.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,SAAS;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,GAAG,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC/D,KAAK,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC7D;AASD,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAIrD;AAED,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAMD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAgEzD"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * apm/policy.ts — enforce the enterprise governance policy (apm-policy.yml).
3
+ *
4
+ * Checks that: declared MCP servers are allow-listed, hook manifests only
5
+ * register allowed events, and each harness target's compiled tool tokens stay
6
+ * isolated (no foreign harness tokens leak across targets).
7
+ */
8
+ import { readFileSync, existsSync, readdirSync } from "node:fs";
9
+ import { resolve } from "node:path";
10
+ import { parse } from "yaml";
11
+ import { sourcePaths } from "../paths.js";
12
+ import { loadManifest } from "./manifest.js";
13
+ import { getCompiler } from "../harness/index.js";
14
+ const TARGET_ALIASES = {
15
+ "github-copilot": "copilot",
16
+ copilot: "copilot",
17
+ "claude-code": "claude",
18
+ claude: "claude",
19
+ };
20
+ export function policyPath(pkgRoot) {
21
+ return resolve(pkgRoot, "apm-policy.yml");
22
+ }
23
+ export function loadPolicy(pkgRoot) {
24
+ const path = policyPath(pkgRoot);
25
+ if (!existsSync(path))
26
+ return {};
27
+ return parse(readFileSync(path, "utf8")) ?? {};
28
+ }
29
+ function toolsLine(content) {
30
+ return content.split("\n").find((line) => line.startsWith("tools:")) ?? "";
31
+ }
32
+ export function checkPolicy(pkgRoot) {
33
+ const errors = [];
34
+ const warnings = [];
35
+ const policy = loadPolicy(pkgRoot);
36
+ if (!existsSync(policyPath(pkgRoot))) {
37
+ warnings.push("apm-policy.yml not found — governance checks are skipped");
38
+ return { ok: true, errors, warnings };
39
+ }
40
+ const { agentsDir, hooksManifest } = sourcePaths(pkgRoot);
41
+ // 1. MCP allowlist.
42
+ const allowedServers = policy.mcp?.allowedServers ?? [];
43
+ const manifest = loadManifest(pkgRoot);
44
+ for (const server of manifest.mcp?.servers ?? []) {
45
+ if (!allowedServers.includes(server.name)) {
46
+ errors.push(`MCP server "${server.name}" is not in policy allowedServers`);
47
+ }
48
+ }
49
+ // 2. Hook event allowlist.
50
+ const allowedEvents = policy.hooks?.allowedEvents;
51
+ if (allowedEvents && existsSync(hooksManifest)) {
52
+ const manifestJson = JSON.parse(readFileSync(hooksManifest, "utf8"));
53
+ for (const event of Object.keys(manifestJson)) {
54
+ if (!allowedEvents.includes(event)) {
55
+ errors.push(`Hook manifest registers disallowed event "${event}"`);
56
+ }
57
+ }
58
+ }
59
+ // 3. Per-target tool-name isolation.
60
+ const agentFiles = existsSync(agentsDir)
61
+ ? readdirSync(agentsDir).filter((f) => f.endsWith(".agent.md"))
62
+ : [];
63
+ for (const [targetName, rules] of Object.entries(policy.targets ?? {})) {
64
+ const target = TARGET_ALIASES[targetName];
65
+ if (!target) {
66
+ warnings.push(`policy targets: unknown target "${targetName}"`);
67
+ continue;
68
+ }
69
+ const forbidden = rules.forbidToolTokens ?? [];
70
+ if (forbidden.length === 0)
71
+ continue;
72
+ const compiler = getCompiler(target);
73
+ for (const file of agentFiles) {
74
+ const source = readFileSync(resolve(agentsDir, file), "utf8");
75
+ const line = toolsLine(compiler.compileAgent(source));
76
+ for (const token of forbidden) {
77
+ if (line.includes(token)) {
78
+ errors.push(`${targetName}: agent "${file}" compiles to a forbidden tool token "${token}"`);
79
+ }
80
+ }
81
+ }
82
+ }
83
+ return { ok: errors.length === 0, errors, warnings };
84
+ }
85
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../../src/cli/lib/apm/policy.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"asset-copier.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/asset-copier.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,QAAQ,EAAqB,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1C,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAqND;;GAEG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,GAChB,UAAU,CA0CZ;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,GAChB,UAAU,CAmDZ;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,WAAW,GAChB,MAAM,CAwBR;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,GAAG,MAAM,CAEjE;AAGD,OAAO,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"asset-copier.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/asset-copier.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,QAAQ,EAAqB,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAI1C,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAmFD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,GAChB,UAAU,CA2CZ;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,GAChB,UAAU,CAoDZ;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,WAAW,GAChB,MAAM,CAwBR;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,GAAG,MAAM,CAEjE;AAGD,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -9,6 +9,7 @@ import { createHash } from "node:crypto";
9
9
  import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync, chmodSync, unlinkSync, } from "node:fs";
10
10
  import { basename, resolve, relative } from "node:path";
11
11
  import { sourcePaths } from "./paths.js";
12
+ import { getCompiler } from "./harness/index.js";
12
13
  function ensureDir(dir) {
13
14
  if (!existsSync(dir))
14
15
  mkdirSync(dir, { recursive: true });
@@ -71,135 +72,15 @@ function copyDir(src, dest, opts, result, renamer, transformer) {
71
72
  }
72
73
  }
73
74
  }
74
- function unique(values) {
75
- return [...new Set(values.filter(Boolean))];
76
- }
77
- function parseToolArray(tools) {
78
- const trimmed = tools.trim();
79
- if (!trimmed)
80
- return [];
81
- if (trimmed.startsWith("[")) {
82
- try {
83
- const parsed = JSON.parse(trimmed);
84
- if (Array.isArray(parsed))
85
- return parsed.map(String);
86
- }
87
- catch {
88
- // Fall through to the comma parser below.
89
- }
90
- }
91
- return trimmed
92
- .replace(/^\[/, "")
93
- .replace(/\]$/, "")
94
- .split(",")
95
- .map((token) => token.trim().replace(/^"|"$/g, ""))
96
- .filter(Boolean);
97
- }
98
- function transformToolsLine(content, mapper, format) {
99
- return content.replace(/^tools:\s*(.+)$/m, (_line, rawTools) => {
100
- const mapped = unique(parseToolArray(rawTools).flatMap(mapper));
101
- if (format === "comma-list")
102
- return `tools: ${mapped.join(", ")}`;
103
- return `tools: ${JSON.stringify(mapped)}`;
104
- });
105
- }
106
- function toCopilotTool(tool) {
107
- if (tool.startsWith("specky/"))
108
- return [tool];
109
- if (tool.startsWith("mcp__specky__")) {
110
- return [`specky/${tool.slice("mcp__specky__".length)}`];
111
- }
112
- if (tool.startsWith("sdd_"))
113
- return [`specky/${tool}`];
114
- switch (tool) {
115
- case "Read":
116
- case "Glob":
117
- case "Grep":
118
- case "search":
119
- return ["search"];
120
- case "Edit":
121
- case "Write":
122
- case "MultiEdit":
123
- case "edit":
124
- return ["edit"];
125
- case "Bash":
126
- case "runCommands":
127
- return ["runCommands"];
128
- case "WebFetch":
129
- case "WebSearch":
130
- case "fetch":
131
- return ["fetch"];
132
- case "Task":
133
- case "agent":
134
- return ["agent"];
135
- case "TodoWrite":
136
- case "todos":
137
- return ["todos"];
138
- default:
139
- return [tool];
140
- }
141
- }
142
- function toClaudeTool(tool) {
143
- if (tool.startsWith("mcp__specky__"))
144
- return [tool];
145
- if (tool.startsWith("specky/")) {
146
- return [`mcp__specky__${tool.slice("specky/".length)}`];
147
- }
148
- if (tool.startsWith("sdd_"))
149
- return [`mcp__specky__${tool}`];
150
- switch (tool) {
151
- case "search":
152
- return ["Read", "Glob", "Grep"];
153
- case "edit":
154
- return ["Edit", "Write"];
155
- case "runCommands":
156
- return ["Bash"];
157
- case "fetch":
158
- return ["WebFetch", "WebSearch"];
159
- case "agent":
160
- return ["Task"];
161
- case "todos":
162
- return ["TodoWrite"];
163
- default:
164
- return [tool];
165
- }
166
- }
167
- function toCopilotAgent(content) {
168
- return transformToolsLine(content, toCopilotTool, "json-array");
169
- }
170
- function toClaudeAgent(content) {
171
- return transformToolsLine(content, toClaudeTool, "comma-list");
172
- }
173
- function toCopilotPrompt(content) {
174
- if (/^agent:/m.test(content))
175
- return content.replace(/^mode:\s*agent\s*$/m, "");
176
- return content.replace(/^mode:\s*agent\s*$/m, "agent: agent");
177
- }
178
- function toClaudePrompt(content) {
179
- return content
180
- .replace(/^agent:\s*agent\s*\n/m, "")
181
- .replace(/^mode:\s*agent\s*\n/m, "");
182
- }
183
- function toClaudeInstruction(content) {
184
- return content.replace(/^applyTo:\s*['"]?\*\*['"]?\s*$/m, "paths: ['**']");
185
- }
186
- /**
187
- * Transform `.agent.md` (Copilot format) to `.md` (Claude Code format).
188
- */
189
- function claudeAgentRenamer(fileName) {
190
- return fileName.replace(/\.agent\.md$/, ".md");
191
- }
192
- function claudePromptRenamer(fileName) {
193
- return fileName.replace(/\.prompt\.md$/, ".md");
194
- }
195
75
  /**
196
76
  * Copy assets to Claude Code `.claude/` layout.
197
77
  */
198
78
  export function copyToClaude(pkgRoot, targets, opts) {
199
79
  const src = sourcePaths(pkgRoot);
200
80
  const result = { written: [], skipped: [] };
201
- copyDir(src.agentsDir, targets.claude.agents, opts, result, claudeAgentRenamer, toClaudeAgent);
202
- copyDir(src.promptsDir, targets.claude.commands, opts, result, claudePromptRenamer, toClaudePrompt);
81
+ const claude = getCompiler("claude");
82
+ copyDir(src.agentsDir, targets.claude.agents, opts, result, claude.renameAgent, claude.compileAgent);
83
+ copyDir(src.promptsDir, targets.claude.commands, opts, result, claude.renamePrompt, claude.compilePrompt);
203
84
  copyDir(src.skillsDir, targets.claude.skills, opts, result);
204
85
  copyDir(src.hookScriptsDir, targets.claude.hooksScripts, opts, result);
205
86
  // Make hook scripts executable (Unix only — Windows ignores mode)
@@ -220,7 +101,7 @@ export function copyToClaude(pkgRoot, targets, opts) {
220
101
  // Copy copilot-instructions to .claude/rules/
221
102
  const instructionSrc = resolve(src.instructionsDir, "copilot-instructions.instructions.md");
222
103
  if (existsSync(instructionSrc)) {
223
- copyFile(instructionSrc, resolve(targets.claude.rules, "copilot-instructions.md"), opts, result, toClaudeInstruction);
104
+ copyFile(instructionSrc, resolve(targets.claude.rules, "copilot-instructions.md"), opts, result, claude.compileInstruction);
224
105
  }
225
106
  return result;
226
107
  }
@@ -230,8 +111,9 @@ export function copyToClaude(pkgRoot, targets, opts) {
230
111
  export function copyToCopilot(pkgRoot, targets, opts) {
231
112
  const src = sourcePaths(pkgRoot);
232
113
  const result = { written: [], skipped: [] };
233
- copyDir(src.agentsDir, targets.copilot.agents, opts, result, undefined, toCopilotAgent);
234
- copyDir(src.promptsDir, targets.copilot.prompts, opts, result, undefined, toCopilotPrompt);
114
+ const copilot = getCompiler("copilot");
115
+ copyDir(src.agentsDir, targets.copilot.agents, opts, result, copilot.renameAgent, copilot.compileAgent);
116
+ copyDir(src.promptsDir, targets.copilot.prompts, opts, result, copilot.renamePrompt, copilot.compilePrompt);
235
117
  copyDir(src.skillsDir, targets.copilot.skills, opts, result);
236
118
  copyDir(src.hookScriptsDir, targets.copilot.hooksScripts, opts, result);
237
119
  // rc.14: Remove stale pre-rc.12 hooks manifest at .github/hooks/specky-sdd-hooks.json.
@@ -1 +1 @@
1
- {"version":3,"file":"asset-copier.js","sourceRoot":"","sources":["../../../src/cli/lib/asset-copier.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,MAAM,EACN,UAAU,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,aAAa,EACb,SAAS,EACT,UAAU,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAYzC,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,IAAiB;IAClD,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,QAAQ,CACf,GAAW,EACX,IAAY,EACZ,IAAiB,EACjB,MAAkB,EAClB,WAA6B;IAE7B,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/B,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC1C,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAID,SAAS,YAAY,CACnB,GAAW,EACX,IAAY,EACZ,IAAiB,EACjB,MAAkB,EAClB,WAA4B;IAE5B,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC1C,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IAC7D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,OAAO,CACd,GAAW,EACX,IAAY,EACZ,IAAiB,EACjB,MAAkB,EAClB,OAAkC,EAClC,WAA6B;IAE7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO;IAC7B,SAAS,CAAC,IAAI,CAAC,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YACrB,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,IAAI,WAAW;gBAAE,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;;gBACvE,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,MAAgB;IAC9B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;YAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;QAC5C,CAAC;IACH,CAAC;IACD,OAAO,OAAO;SACX,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;SAClD,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,kBAAkB,CACzB,OAAe,EACf,MAAkC,EAClC,MAAmC;IAEnC,OAAO,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,QAAgB,EAAE,EAAE;QACrE,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAChE,IAAI,MAAM,KAAK,YAAY;YAAE,OAAO,UAAU,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClE,OAAO,UAAU,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IAEvD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ;YACX,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpB,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,WAAW,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,KAAK,MAAM,CAAC;QACZ,KAAK,aAAa;YAChB,OAAO,CAAC,aAAa,CAAC,CAAC;QACzB,KAAK,UAAU,CAAC;QAChB,KAAK,WAAW,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO;YACV,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,KAAK,WAAW,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB;YACE,OAAO,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,gBAAgB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IAE7D,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAClC,KAAK,MAAM;YACT,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3B,KAAK,aAAa;YAChB,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACnC,KAAK,OAAO;YACV,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,CAAC,WAAW,CAAC,CAAC;QACvB;YACE,OAAO,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;IAChF,OAAO,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO,OAAO;SACX,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC;SACpC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe;IAC1C,OAAO,OAAO,CAAC,OAAO,CAAC,iCAAiC,EAAE,eAAe,CAAC,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,OAAO,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,OAAO,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,OAAgB,EAChB,IAAiB;IAEjB,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAExD,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;IAC/F,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAC;IACpG,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAEvE,kEAAkE;IAClE,IACE,CAAC,IAAI,CAAC,MAAM;QACZ,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC5B,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EACvC,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC;oBACH,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBAC5D,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,MAAM,cAAc,GAAG,OAAO,CAC5B,GAAG,CAAC,eAAe,EACnB,sCAAsC,CACvC,CAAC;IACF,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,QAAQ,CACN,cAAc,EACd,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,yBAAyB,CAAC,EACxD,IAAI,EACJ,MAAM,EACN,mBAAmB,CACpB,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAe,EACf,OAAgB,EAChB,IAAiB;IAEjB,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAExD,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IACxF,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAExE,uFAAuF;IACvF,sFAAsF;IACtF,8EAA8E;IAC9E,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,uBAAuB,CAAC,CAAC;IACxF,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC;YAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iCAAiC,CAAC,CAAC;IAChF,CAAC;IAED,wEAAwE;IACxE,yEAAyE;IACzE,6EAA6E;IAC7E,iFAAiF;IACjF,IAAI,UAAU,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACzC,QAAQ,CAAC,GAAG,CAAC,oBAAoB,EAAE,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAClF,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CACV,+EAA+E;gBAC/E,oFAAoF,CACrF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAEzE,IACE,CAAC,IAAI,CAAC,MAAM;QACZ,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC5B,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,EACxC,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC;oBACH,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBAC7D,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAAgB,EAChB,MAAoB,EACpB,OAAe,EACf,IAAiB;IAEjB,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;oBACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG;QACX,OAAO;QACP,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACtC,KAAK,EAAE,OAAO;KACf,CAAC;IACF,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAChE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,CAAa;IACvD,OAAO,KAAK,IAAI,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC;AAC/E,CAAC;AAED,iCAAiC;AACjC,OAAO,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"asset-copier.js","sourceRoot":"","sources":["../../../src/cli/lib/asset-copier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * harness/compilers/claude.ts — renders canonical primitives into Claude Code
3
+ * native form: `.claude/agents/*.md`, `.claude/commands/*.md`, comma-list
4
+ * `tools:` with `Read`/`Glob`/`Grep`/`Task` and `mcp__specky__sdd_*` MCP
5
+ * tools, commands without Copilot-only `agent:` frontmatter, and rules that
6
+ * use `paths:` instead of Copilot's `applyTo:`.
7
+ */
8
+ import type { HarnessCompiler } from "../types.js";
9
+ export declare const claudeCompiler: HarnessCompiler;
10
+ //# sourceMappingURL=claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../../../src/cli/lib/harness/compilers/claude.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,eAAO,MAAM,cAAc,EAAE,eAwB5B,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * harness/compilers/claude.ts — renders canonical primitives into Claude Code
3
+ * native form: `.claude/agents/*.md`, `.claude/commands/*.md`, comma-list
4
+ * `tools:` with `Read`/`Glob`/`Grep`/`Task` and `mcp__specky__sdd_*` MCP
5
+ * tools, commands without Copilot-only `agent:` frontmatter, and rules that
6
+ * use `paths:` instead of Copilot's `applyTo:`.
7
+ */
8
+ import { transformToolsLine } from "./common.js";
9
+ export const claudeCompiler = {
10
+ target: "claude",
11
+ compileAgent(content) {
12
+ return transformToolsLine(content, "claude", "comma-list");
13
+ },
14
+ compilePrompt(content) {
15
+ return content
16
+ .replace(/^agent:\s*agent\s*\n/m, "")
17
+ .replace(/^mode:\s*agent\s*\n/m, "");
18
+ },
19
+ compileInstruction(content) {
20
+ return content.replace(/^applyTo:\s*['"]?\*\*['"]?\s*$/m, "paths: ['**']");
21
+ },
22
+ renameAgent(fileName) {
23
+ return fileName.replace(/\.agent\.md$/, ".md");
24
+ },
25
+ renamePrompt(fileName) {
26
+ return fileName.replace(/\.prompt\.md$/, ".md");
27
+ },
28
+ };
29
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../../../src/cli/lib/harness/compilers/claude.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC3C,MAAM,EAAE,QAAQ;IAEhB,YAAY,CAAC,OAAO;QAChB,OAAO,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC/D,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,OAAO,CAAC,iCAAiC,EAAE,eAAe,CAAC,CAAC;IAC/E,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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * harness/compilers/common.ts — shared frontmatter/tool-line helpers used by
3
+ * every harness compiler.
4
+ */
5
+ import type { HarnessTarget } from "../types.js";
6
+ export declare function unique(values: string[]): string[];
7
+ /** Parse a frontmatter `tools:` value that is a JSON array or a comma list. */
8
+ export declare function parseToolArray(tools: string): string[];
9
+ /**
10
+ * Rewrite the `tools:` frontmatter line for a target harness, mapping each
11
+ * source token to its native token(s) and serializing in the harness's format.
12
+ */
13
+ export declare function transformToolsLine(content: string, target: HarnessTarget, format: "json-array" | "comma-list"): string;
14
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +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;AAGjD,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEjD;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBtD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,YAAY,GAAG,YAAY,GACpC,MAAM,CAQR"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * harness/compilers/common.ts — shared frontmatter/tool-line helpers used by
3
+ * every harness compiler.
4
+ */
5
+ import { mapTool } from "../tool-map.js";
6
+ export function unique(values) {
7
+ return [...new Set(values.filter(Boolean))];
8
+ }
9
+ /** Parse a frontmatter `tools:` value that is a JSON array or a comma list. */
10
+ export function parseToolArray(tools) {
11
+ const trimmed = tools.trim();
12
+ if (!trimmed)
13
+ return [];
14
+ if (trimmed.startsWith("[")) {
15
+ try {
16
+ const parsed = JSON.parse(trimmed);
17
+ if (Array.isArray(parsed))
18
+ return parsed.map(String);
19
+ }
20
+ catch {
21
+ // Fall through to the comma parser below.
22
+ }
23
+ }
24
+ return trimmed
25
+ .replace(/^\[/, "")
26
+ .replace(/\]$/, "")
27
+ .split(",")
28
+ .map((token) => token.trim().replace(/^"|"$/g, ""))
29
+ .filter(Boolean);
30
+ }
31
+ /**
32
+ * Rewrite the `tools:` frontmatter line for a target harness, mapping each
33
+ * source token to its native token(s) and serializing in the harness's format.
34
+ */
35
+ export function transformToolsLine(content, target, format) {
36
+ return content.replace(/^tools:\s*(.+)$/m, (_line, rawTools) => {
37
+ const mapped = unique(parseToolArray(rawTools).flatMap((token) => mapTool(token, target)));
38
+ if (format === "comma-list")
39
+ return `tools: ${mapped.join(", ")}`;
40
+ return `tools: ${JSON.stringify(mapped)}`;
41
+ });
42
+ }
43
+ //# sourceMappingURL=common.js.map
@@ -0,0 +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;AAEzC,MAAM,UAAU,MAAM,CAAC,MAAgB;IACnC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,KAAa;IACxC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;YAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACL,0CAA0C;QAC9C,CAAC;IACL,CAAC;IACD,OAAO,OAAO;SACT,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;SAClD,MAAM,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAC9B,OAAe,EACf,MAAqB,EACrB,MAAmC;IAEnC,OAAO,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,QAAgB,EAAE,EAAE;QACnE,MAAM,MAAM,GAAG,MAAM,CACjB,cAAc,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CACtE,CAAC;QACF,IAAI,MAAM,KAAK,YAAY;YAAE,OAAO,UAAU,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClE,OAAO,UAAU,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * harness/compilers/copilot.ts — renders canonical primitives into GitHub
3
+ * Copilot (VS Code) native form: `.github/agents/*.agent.md`,
4
+ * `.github/prompts/*.prompt.md`, JSON-array `tools:` with `search`/`agent`/
5
+ * `edit`/`fetch` and namespaced `specky/sdd_*` MCP tools, and `agent: agent`
6
+ * prompt frontmatter.
7
+ */
8
+ import type { HarnessCompiler } from "../types.js";
9
+ export declare const copilotCompiler: HarnessCompiler;
10
+ //# sourceMappingURL=copilot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../../../../src/cli/lib/harness/compilers/copilot.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,eAAO,MAAM,eAAe,EAAE,eA2B7B,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * harness/compilers/copilot.ts — renders canonical primitives into GitHub
3
+ * Copilot (VS Code) native form: `.github/agents/*.agent.md`,
4
+ * `.github/prompts/*.prompt.md`, JSON-array `tools:` with `search`/`agent`/
5
+ * `edit`/`fetch` and namespaced `specky/sdd_*` MCP tools, and `agent: agent`
6
+ * prompt frontmatter.
7
+ */
8
+ import { transformToolsLine } from "./common.js";
9
+ export const copilotCompiler = {
10
+ target: "copilot",
11
+ compileAgent(content) {
12
+ return transformToolsLine(content, "copilot", "json-array");
13
+ },
14
+ compilePrompt(content) {
15
+ // `.apm` prompts already use `agent: agent`; keep them and drop any stray
16
+ // legacy `mode: agent` line. If only a legacy line exists, upgrade it.
17
+ if (/^agent:/m.test(content)) {
18
+ return content.replace(/^mode:\s*agent\s*$/m, "");
19
+ }
20
+ return content.replace(/^mode:\s*agent\s*$/m, "agent: agent");
21
+ },
22
+ compileInstruction(content) {
23
+ return content;
24
+ },
25
+ renameAgent(fileName) {
26
+ return fileName;
27
+ },
28
+ renamePrompt(fileName) {
29
+ return fileName;
30
+ },
31
+ };
32
+ //# sourceMappingURL=copilot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../../../src/cli/lib/harness/compilers/copilot.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC5C,MAAM,EAAE,SAAS;IAEjB,YAAY,CAAC,OAAO;QAChB,OAAO,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAChE,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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * harness/index.ts — the harness compiler registry.
3
+ *
4
+ * `getCompiler(target)` returns the compiler that renders Specky's canonical
5
+ * `.apm` primitives into a harness's native form. Register new harnesses here.
6
+ */
7
+ import type { HarnessCompiler, HarnessTarget } from "./types.js";
8
+ export declare function getCompiler(target: HarnessTarget): HarnessCompiler;
9
+ export declare const SUPPORTED_TARGETS: HarnessTarget[];
10
+ export type { HarnessCompiler, HarnessTarget } from "./types.js";
11
+ export { mapTool, normalizeToLogical, logicalToNative } from "./tool-map.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/harness/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AASjE,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,eAAe,CAElE;AAED,eAAO,MAAM,iBAAiB,EAA6B,aAAa,EAAE,CAAC;AAE3E,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * harness/index.ts — the harness compiler registry.
3
+ *
4
+ * `getCompiler(target)` returns the compiler that renders Specky's canonical
5
+ * `.apm` primitives into a harness's native form. Register new harnesses here.
6
+ */
7
+ import { copilotCompiler } from "./compilers/copilot.js";
8
+ import { claudeCompiler } from "./compilers/claude.js";
9
+ const COMPILERS = {
10
+ copilot: copilotCompiler,
11
+ claude: claudeCompiler,
12
+ };
13
+ export function getCompiler(target) {
14
+ return COMPILERS[target];
15
+ }
16
+ export const SUPPORTED_TARGETS = Object.keys(COMPILERS);
17
+ export { mapTool, normalizeToLogical, logicalToNative } from "./tool-map.js";
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/lib/harness/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,SAAS,GAA2C;IACtD,OAAO,EAAE,eAAe;IACxB,MAAM,EAAE,cAAc;CACzB,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,MAAqB;IAC7C,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAoB,CAAC;AAG3E,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}