@jean.gnc/harness-kit 0.5.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.
Files changed (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +190 -0
  3. package/dist/agent/index.d.ts +3 -0
  4. package/dist/agent/index.d.ts.map +1 -0
  5. package/dist/agent/index.js +2 -0
  6. package/dist/agent/index.js.map +1 -0
  7. package/dist/agent/schema.d.ts +20 -0
  8. package/dist/agent/schema.d.ts.map +1 -0
  9. package/dist/agent/schema.js +20 -0
  10. package/dist/agent/schema.js.map +1 -0
  11. package/dist/build.d.ts +9 -0
  12. package/dist/build.d.ts.map +1 -0
  13. package/dist/build.js +18 -0
  14. package/dist/build.js.map +1 -0
  15. package/dist/check/index.d.ts +27 -0
  16. package/dist/check/index.d.ts.map +1 -0
  17. package/dist/check/index.js +160 -0
  18. package/dist/check/index.js.map +1 -0
  19. package/dist/check/kinds.d.ts +11 -0
  20. package/dist/check/kinds.d.ts.map +1 -0
  21. package/dist/check/kinds.js +65 -0
  22. package/dist/check/kinds.js.map +1 -0
  23. package/dist/check/suggest.d.ts +2 -0
  24. package/dist/check/suggest.d.ts.map +1 -0
  25. package/dist/check/suggest.js +37 -0
  26. package/dist/check/suggest.js.map +1 -0
  27. package/dist/cli.d.ts +3 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +146 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/command/index.d.ts +3 -0
  32. package/dist/command/index.d.ts.map +1 -0
  33. package/dist/command/index.js +2 -0
  34. package/dist/command/index.js.map +1 -0
  35. package/dist/command/schema.d.ts +23 -0
  36. package/dist/command/schema.d.ts.map +1 -0
  37. package/dist/command/schema.js +21 -0
  38. package/dist/command/schema.js.map +1 -0
  39. package/dist/compile/discovery.d.ts +2 -0
  40. package/dist/compile/discovery.d.ts.map +1 -0
  41. package/dist/compile/discovery.js +4 -0
  42. package/dist/compile/discovery.js.map +1 -0
  43. package/dist/compile/emit.d.ts +15 -0
  44. package/dist/compile/emit.d.ts.map +1 -0
  45. package/dist/compile/emit.js +123 -0
  46. package/dist/compile/emit.js.map +1 -0
  47. package/dist/compile/frontmatter.d.ts +7 -0
  48. package/dist/compile/frontmatter.d.ts.map +1 -0
  49. package/dist/compile/frontmatter.js +44 -0
  50. package/dist/compile/frontmatter.js.map +1 -0
  51. package/dist/compile/index.d.ts +9 -0
  52. package/dist/compile/index.d.ts.map +1 -0
  53. package/dist/compile/index.js +123 -0
  54. package/dist/compile/index.js.map +1 -0
  55. package/dist/compile/validators.d.ts +9 -0
  56. package/dist/compile/validators.d.ts.map +1 -0
  57. package/dist/compile/validators.js +112 -0
  58. package/dist/compile/validators.js.map +1 -0
  59. package/dist/errors/index.d.ts +2 -0
  60. package/dist/errors/index.d.ts.map +1 -0
  61. package/dist/errors/index.js +2 -0
  62. package/dist/errors/index.js.map +1 -0
  63. package/dist/errors/zod.d.ts +3 -0
  64. package/dist/errors/zod.d.ts.map +1 -0
  65. package/dist/errors/zod.js +4 -0
  66. package/dist/errors/zod.js.map +1 -0
  67. package/dist/fs.d.ts +2 -0
  68. package/dist/fs.d.ts.map +1 -0
  69. package/dist/fs.js +11 -0
  70. package/dist/fs.js.map +1 -0
  71. package/dist/ids.d.ts +5 -0
  72. package/dist/ids.d.ts.map +1 -0
  73. package/dist/ids.js +9 -0
  74. package/dist/ids.js.map +1 -0
  75. package/dist/index.d.ts +23 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +12 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/install/claude.d.ts +4 -0
  80. package/dist/install/claude.d.ts.map +1 -0
  81. package/dist/install/claude.js +37 -0
  82. package/dist/install/claude.js.map +1 -0
  83. package/dist/install/codex.d.ts +4 -0
  84. package/dist/install/codex.d.ts.map +1 -0
  85. package/dist/install/codex.js +29 -0
  86. package/dist/install/codex.js.map +1 -0
  87. package/dist/install/discovery.d.ts +21 -0
  88. package/dist/install/discovery.d.ts.map +1 -0
  89. package/dist/install/discovery.js +51 -0
  90. package/dist/install/discovery.js.map +1 -0
  91. package/dist/install/index.d.ts +28 -0
  92. package/dist/install/index.d.ts.map +1 -0
  93. package/dist/install/index.js +44 -0
  94. package/dist/install/index.js.map +1 -0
  95. package/dist/install/runner.d.ts +4 -0
  96. package/dist/install/runner.d.ts.map +1 -0
  97. package/dist/install/runner.js +15 -0
  98. package/dist/install/runner.js.map +1 -0
  99. package/dist/installed.d.ts +36 -0
  100. package/dist/installed.d.ts.map +1 -0
  101. package/dist/installed.js +155 -0
  102. package/dist/installed.js.map +1 -0
  103. package/dist/layout/index.d.ts +63 -0
  104. package/dist/layout/index.d.ts.map +1 -0
  105. package/dist/layout/index.js +159 -0
  106. package/dist/layout/index.js.map +1 -0
  107. package/dist/lint.d.ts +9 -0
  108. package/dist/lint.d.ts.map +1 -0
  109. package/dist/lint.js +27 -0
  110. package/dist/lint.js.map +1 -0
  111. package/dist/marketplace/index.d.ts +3 -0
  112. package/dist/marketplace/index.d.ts.map +1 -0
  113. package/dist/marketplace/index.js +2 -0
  114. package/dist/marketplace/index.js.map +1 -0
  115. package/dist/marketplace/schema.d.ts +495 -0
  116. package/dist/marketplace/schema.d.ts.map +1 -0
  117. package/dist/marketplace/schema.js +92 -0
  118. package/dist/marketplace/schema.js.map +1 -0
  119. package/dist/parsing/frontmatter.d.ts +16 -0
  120. package/dist/parsing/frontmatter.d.ts.map +1 -0
  121. package/dist/parsing/frontmatter.js +45 -0
  122. package/dist/parsing/frontmatter.js.map +1 -0
  123. package/dist/parsing/index.d.ts +3 -0
  124. package/dist/parsing/index.d.ts.map +1 -0
  125. package/dist/parsing/index.js +2 -0
  126. package/dist/parsing/index.js.map +1 -0
  127. package/dist/placeholders/index.d.ts +5 -0
  128. package/dist/placeholders/index.d.ts.map +1 -0
  129. package/dist/placeholders/index.js +3 -0
  130. package/dist/placeholders/index.js.map +1 -0
  131. package/dist/placeholders/source-position.d.ts +6 -0
  132. package/dist/placeholders/source-position.d.ts.map +1 -0
  133. package/dist/placeholders/source-position.js +13 -0
  134. package/dist/placeholders/source-position.js.map +1 -0
  135. package/dist/placeholders/tokens.d.ts +26 -0
  136. package/dist/placeholders/tokens.d.ts.map +1 -0
  137. package/dist/placeholders/tokens.js +50 -0
  138. package/dist/placeholders/tokens.js.map +1 -0
  139. package/dist/plugin/index.d.ts +3 -0
  140. package/dist/plugin/index.d.ts.map +1 -0
  141. package/dist/plugin/index.js +2 -0
  142. package/dist/plugin/index.js.map +1 -0
  143. package/dist/plugin/schema.d.ts +164 -0
  144. package/dist/plugin/schema.d.ts.map +1 -0
  145. package/dist/plugin/schema.js +61 -0
  146. package/dist/plugin/schema.js.map +1 -0
  147. package/dist/readme/index.d.ts +24 -0
  148. package/dist/readme/index.d.ts.map +1 -0
  149. package/dist/readme/index.js +119 -0
  150. package/dist/readme/index.js.map +1 -0
  151. package/dist/result.d.ts +10 -0
  152. package/dist/result.d.ts.map +1 -0
  153. package/dist/result.js +7 -0
  154. package/dist/result.js.map +1 -0
  155. package/dist/skill/includes.d.ts +29 -0
  156. package/dist/skill/includes.d.ts.map +1 -0
  157. package/dist/skill/includes.js +81 -0
  158. package/dist/skill/includes.js.map +1 -0
  159. package/dist/skill/index.d.ts +8 -0
  160. package/dist/skill/index.d.ts.map +1 -0
  161. package/dist/skill/index.js +5 -0
  162. package/dist/skill/index.js.map +1 -0
  163. package/dist/skill/invariants.d.ts +3 -0
  164. package/dist/skill/invariants.d.ts.map +1 -0
  165. package/dist/skill/invariants.js +17 -0
  166. package/dist/skill/invariants.js.map +1 -0
  167. package/dist/skill/schema.d.ts +50 -0
  168. package/dist/skill/schema.d.ts.map +1 -0
  169. package/dist/skill/schema.js +36 -0
  170. package/dist/skill/schema.js.map +1 -0
  171. package/dist/skill/source.d.ts +48 -0
  172. package/dist/skill/source.d.ts.map +1 -0
  173. package/dist/skill/source.js +114 -0
  174. package/dist/skill/source.js.map +1 -0
  175. package/package.json +91 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../src/check/suggest.ts"],"names":[],"mappings":"AAAA,MAAM,yBAAyB,GAAG,CAAC,CAAC;AACpC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAEtC,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,QAA2B;IACtE,IAAI,IAAI,GAA+C,IAAI,CAAC;IAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,yBAAyB,EACzB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,2BAA2B,CAAC,CACxD,CAAC;IACF,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAChD,IAAI,QAAQ,GAAG,SAAS;YAAE,SAAS;QACnC,IAAI,CAAC,IAAI,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ;YAAE,IAAI,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC/E,CAAC;IACD,OAAO,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC;AAC7B,CAAC;AAED,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS;IACvC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,IAAI,IAAI,GAAG,IAAI,KAAK,CAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACxC,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;YAC/C,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QACxD,CAAC;QACD,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+ import { defineCommand, runMain } from "citty";
5
+ import { z } from "zod";
6
+ import { build } from "./build.js";
7
+ import { check } from "./check/index.js";
8
+ import { install, uninstall } from "./install/index.js";
9
+ import { lint } from "./lint.js";
10
+ const PackageJsonSchema = z.object({ version: z.string().min(1) });
11
+ const pkgPath = fileURLToPath(new URL("../package.json", import.meta.url));
12
+ const pkg = PackageJsonSchema.parse(JSON.parse(readFileSync(pkgPath, "utf8")));
13
+ function isTarget(value) {
14
+ return value === "claude" || value === "codex";
15
+ }
16
+ function parseTargets(value) {
17
+ if (!value)
18
+ return undefined;
19
+ return value.split(",").map((p) => {
20
+ const trimmed = p.trim();
21
+ if (!isTarget(trimmed)) {
22
+ throw new Error(`Unknown target "${trimmed}". Valid: claude, codex`);
23
+ }
24
+ return trimmed;
25
+ });
26
+ }
27
+ function parseCheckMode(value) {
28
+ if (value === "local" || value === "installed" || value === "all")
29
+ return value;
30
+ throw new Error(`Unknown check mode "${value}". Valid: local, installed, all`);
31
+ }
32
+ const buildCmd = defineCommand({
33
+ meta: { name: "build", description: "Compile typed skill sources to dist/" },
34
+ args: {
35
+ src: { type: "string", default: "./src", description: "source root" },
36
+ out: { type: "string", default: "./dist", description: "output root" },
37
+ silent: { type: "boolean", default: false, description: "suppress success log" },
38
+ },
39
+ run: async ({ args }) => {
40
+ await build({ srcRoot: args.src, outRoot: args.out, silent: args.silent });
41
+ },
42
+ });
43
+ const installArgs = {
44
+ dist: { type: "string", default: "./dist", description: "dist root" },
45
+ targets: {
46
+ type: "string",
47
+ description: "comma-separated targets: claude,codex (default: both)",
48
+ required: false,
49
+ },
50
+ silent: { type: "boolean", default: false, description: "suppress success log" },
51
+ };
52
+ const installCmd = defineCommand({
53
+ meta: { name: "install", description: "Install compiled plugins into Claude/Codex" },
54
+ args: installArgs,
55
+ run: async ({ args }) => {
56
+ const targets = parseTargets(args.targets);
57
+ await install({
58
+ distRoot: args.dist,
59
+ silent: args.silent,
60
+ ...(targets !== undefined ? { targets } : {}),
61
+ });
62
+ },
63
+ });
64
+ const uninstallCmd = defineCommand({
65
+ meta: { name: "uninstall", description: "Remove installed plugins from Claude/Codex" },
66
+ args: installArgs,
67
+ run: async ({ args }) => {
68
+ const targets = parseTargets(args.targets);
69
+ await uninstall({
70
+ distRoot: args.dist,
71
+ silent: args.silent,
72
+ ...(targets !== undefined ? { targets } : {}),
73
+ });
74
+ },
75
+ });
76
+ const checkCmd = defineCommand({
77
+ meta: {
78
+ name: "check",
79
+ description: "Validate plugin references — local, installed (ext:), or both",
80
+ },
81
+ args: {
82
+ src: { type: "string", default: "./src", description: "source root" },
83
+ mode: {
84
+ type: "string",
85
+ default: "installed",
86
+ description: "validation scope: local | installed | all",
87
+ },
88
+ silent: { type: "boolean", default: false, description: "suppress non-error output" },
89
+ },
90
+ run: async ({ args }) => {
91
+ const mode = parseCheckMode(args.mode);
92
+ const result = await check({ srcRoot: args.src, mode });
93
+ if (!args.silent) {
94
+ const breakdown = result.indexedSources.map((s) => `${s.source}=${s.skillCount}`).join(", ");
95
+ const total = result.indexedSources.reduce((acc, s) => acc + s.skillCount, 0);
96
+ console.log(`indexed ${total} skills across ${result.indexedSources.length} sources (${breakdown})`);
97
+ console.log(`checked ${result.checkedFiles} source files`);
98
+ if (result.violations.length > 0)
99
+ console.log("");
100
+ }
101
+ for (const v of result.violations) {
102
+ console.log(formatViolation(v));
103
+ }
104
+ if (result.violations.length > 0) {
105
+ if (!args.silent) {
106
+ console.log("");
107
+ console.log(`${result.violations.length} violations`);
108
+ }
109
+ process.exit(1);
110
+ }
111
+ },
112
+ });
113
+ function formatViolation(v) {
114
+ return `${v.file}:${v.line}:${v.column} \`${v.token}\` — ${v.message}`;
115
+ }
116
+ const lintCmd = defineCommand({
117
+ meta: {
118
+ name: "lint",
119
+ description: "Lint compiled markdown under dist/ with harness-kit's default rules",
120
+ },
121
+ args: {
122
+ out: { type: "string", default: "./dist", description: "output root" },
123
+ silent: { type: "boolean", default: false, description: "suppress non-error output" },
124
+ },
125
+ run: async ({ args }) => {
126
+ const result = await lint({ outRoot: args.out, silent: args.silent });
127
+ if (result.errorCount > 0)
128
+ process.exit(1);
129
+ },
130
+ });
131
+ const main = defineCommand({
132
+ meta: {
133
+ name: "harness-kit",
134
+ version: pkg.version,
135
+ description: "Typed framework for authoring Claude Code skills.",
136
+ },
137
+ subCommands: {
138
+ build: buildCmd,
139
+ check: checkCmd,
140
+ install: installCmd,
141
+ lint: lintCmd,
142
+ uninstall: uninstallCmd,
143
+ },
144
+ });
145
+ await runMain(main);
146
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { CommandSchema, defineCommand } from "./schema.js";
2
+ export type { Command } from "./schema.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/command/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { CommandSchema, defineCommand } from "./schema.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/command/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { z } from "zod";
2
+ export declare const CommandSchema: z.ZodObject<{
3
+ name: z.ZodString;
4
+ description: z.ZodEffects<z.ZodString, string, string>;
5
+ "argument-hint": z.ZodOptional<z.ZodString>;
6
+ "allowed-tools": z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
7
+ model: z.ZodOptional<z.ZodString>;
8
+ }, "strict", z.ZodTypeAny, {
9
+ name: string;
10
+ description: string;
11
+ model?: string | undefined;
12
+ "argument-hint"?: string | undefined;
13
+ "allowed-tools"?: string | string[] | undefined;
14
+ }, {
15
+ name: string;
16
+ description: string;
17
+ model?: string | undefined;
18
+ "argument-hint"?: string | undefined;
19
+ "allowed-tools"?: string | string[] | undefined;
20
+ }>;
21
+ export type Command = z.infer<typeof CommandSchema>;
22
+ export declare function defineCommand(command: Command): Command;
23
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/command/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;EAef,CAAC;AAEZ,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEpD,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAEvD"}
@@ -0,0 +1,21 @@
1
+ import { z } from "zod";
2
+ export const CommandSchema = z
3
+ .object({
4
+ name: z
5
+ .string()
6
+ .min(1)
7
+ .regex(/^[a-z0-9-]+$/, "name must be lowercase kebab-case"),
8
+ description: z
9
+ .string()
10
+ .min(1)
11
+ .max(1024)
12
+ .refine((s) => !s.includes("\n"), "description cannot contain newlines"),
13
+ "argument-hint": z.string().min(1).optional(),
14
+ "allowed-tools": z.union([z.string().min(1), z.array(z.string().min(1))]).optional(),
15
+ model: z.string().min(1).optional(),
16
+ })
17
+ .strict();
18
+ export function defineCommand(command) {
19
+ return CommandSchema.parse(command);
20
+ }
21
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/command/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,MAAM,CAAC;IACN,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,KAAK,CAAC,cAAc,EAAE,mCAAmC,CAAC;IAC7D,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,IAAI,CAAC;SACT,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,qCAAqC,CAAC;IAC1E,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC7C,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACpC,CAAC;KACD,MAAM,EAAE,CAAC;AAIZ,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function throwInvariantViolations(srcPath: string, errors: readonly string[]): never;
2
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/compile/discovery.ts"],"names":[],"mappings":"AAAA,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,KAAK,CAE1F"}
@@ -0,0 +1,4 @@
1
+ export function throwInvariantViolations(srcPath, errors) {
2
+ throw new Error(`invariant violations in ${srcPath}:\n - ${errors.join("\n - ")}`);
3
+ }
4
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/compile/discovery.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,wBAAwB,CAAC,OAAe,EAAE,MAAyB;IACjF,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,UAAU,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACvF,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type OwningPlugin } from "./validators.js";
2
+ import type { LocalIds } from "../layout/index.js";
3
+ export type { LocalIds } from "../layout/index.js";
4
+ export type { OwningPlugin } from "./validators.js";
5
+ export type BodyInvariant = (body: string) => string[];
6
+ export interface CompileTreeOptions {
7
+ readonly srcRoot: string;
8
+ readonly outRoot: string;
9
+ readonly localIds: LocalIds;
10
+ readonly bodyInvariants: readonly BodyInvariant[];
11
+ readonly contextFiles?: ReadonlySet<string>;
12
+ readonly owner: OwningPlugin;
13
+ }
14
+ export declare function compileTree(options: CompileTreeOptions): Promise<void>;
15
+ //# sourceMappingURL=emit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/compile/emit.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAInD,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;AAEvD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;IAClD,QAAQ,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;CAC9B;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC5E"}
@@ -0,0 +1,123 @@
1
+ import { mkdir, readdir, copyFile, readFile, writeFile } from "node:fs/promises";
2
+ import { basename, dirname, join, relative } from "node:path";
3
+ import { checkCompanionFiles, expandIncludes, formatIncludeError, formatLoadSkillError, isReservedCompanionFilename, loadSkill, } from "../skill/index.js";
4
+ import { substitute } from "../placeholders/index.js";
5
+ import { throwInvariantViolations } from "./discovery.js";
6
+ import { checkCompanionsTokenParity, precomputeExistingRefs, renderFrontmatter, } from "./frontmatter.js";
7
+ import { buildRegistry } from "./validators.js";
8
+ const SKILL_SOURCE_FILENAMES = new Set(["SKILL.ts", "SKILL.md"]);
9
+ export async function compileTree(options) {
10
+ const { srcRoot, outRoot, localIds, bodyInvariants, owner } = options;
11
+ const contextFiles = options.contextFiles ?? new Set();
12
+ const skillFolders = await collectSkillFolders(srcRoot);
13
+ const handledAbsPaths = new Set();
14
+ for await (const absPath of walk(srcRoot)) {
15
+ if (!SKILL_SOURCE_FILENAMES.has(basename(absPath)))
16
+ continue;
17
+ const target = join(outRoot, relative(srcRoot, absPath));
18
+ const companions = skillFolders.get(dirname(absPath)) ?? [];
19
+ const result = await emitSkill(absPath, join(dirname(target), "SKILL.md"), companions, localIds, bodyInvariants, owner);
20
+ for (const p of result.resolvedIncludes)
21
+ handledAbsPaths.add(p);
22
+ }
23
+ for (const absPath of contextFiles) {
24
+ const target = join(outRoot, relative(srcRoot, absPath));
25
+ await emitContextFile(absPath, target, localIds, owner);
26
+ handledAbsPaths.add(absPath);
27
+ }
28
+ for await (const absPath of walk(srcRoot)) {
29
+ const file = basename(absPath);
30
+ if (SKILL_SOURCE_FILENAMES.has(file))
31
+ continue;
32
+ if (absPath.endsWith(".ts"))
33
+ continue;
34
+ if (file === "body.md")
35
+ continue;
36
+ if (handledAbsPaths.has(absPath))
37
+ continue;
38
+ const target = join(outRoot, relative(srcRoot, absPath));
39
+ await mkdir(dirname(target), { recursive: true });
40
+ await copyFile(absPath, target);
41
+ }
42
+ }
43
+ async function emitContextFile(srcPath, outPath, localIds, owner) {
44
+ const raw = await readFile(srcPath, "utf8");
45
+ const dir = dirname(srcPath);
46
+ const expanded = await expandIncludes(raw, srcPath, dir);
47
+ if (!expanded.ok) {
48
+ throwInvariantViolations(srcPath, expanded.error.map(formatIncludeError));
49
+ }
50
+ const expandedBody = expanded.value.body;
51
+ const existingRefs = await precomputeExistingRefs(expandedBody, dir);
52
+ const registry = buildRegistry(undefined, localIds, existingRefs, dir, owner);
53
+ const result = substitute(expandedBody, registry);
54
+ if (!result.ok) {
55
+ throwInvariantViolations(srcPath, result.errors);
56
+ }
57
+ await mkdir(dirname(outPath), { recursive: true });
58
+ await writeFile(outPath, result.rendered);
59
+ }
60
+ async function collectSkillFolders(srcRoot) {
61
+ const result = new Map();
62
+ for await (const absPath of walk(srcRoot)) {
63
+ const dir = dirname(absPath);
64
+ const file = basename(absPath);
65
+ if (SKILL_SOURCE_FILENAMES.has(file)) {
66
+ result.set(dir, result.get(dir) ?? []);
67
+ }
68
+ else if (file.endsWith(".md") && !isReservedCompanionFilename(file)) {
69
+ const list = result.get(dir) ?? [];
70
+ list.push(file);
71
+ result.set(dir, list);
72
+ }
73
+ }
74
+ return result;
75
+ }
76
+ async function emitSkill(srcPath, outPath, siblings, localIds, bodyInvariants, owner) {
77
+ const skillDir = dirname(srcPath);
78
+ const loaded = await loadSkill(skillDir);
79
+ if (!loaded.ok) {
80
+ throwInvariantViolations(srcPath, formatLoadSkillError(loaded.error));
81
+ }
82
+ const { skill, body } = loaded.value;
83
+ const expectedName = basename(skillDir);
84
+ const expanded = await expandIncludes(body, loaded.value.skillFilePath, skillDir);
85
+ if (!expanded.ok) {
86
+ throwInvariantViolations(srcPath, expanded.error.map(formatIncludeError));
87
+ }
88
+ const expandedBody = expanded.value.body;
89
+ const includedFilenames = new Set([...expanded.value.resolvedIncludes].map((p) => relative(skillDir, p)));
90
+ const filteredSiblings = siblings.filter((s) => !includedFilenames.has(s));
91
+ const errors = [];
92
+ if (skill.name !== expectedName) {
93
+ errors.push(`name "${skill.name}" does not match folder "${expectedName}"`);
94
+ }
95
+ for (const check of bodyInvariants) {
96
+ errors.push(...check(expandedBody));
97
+ }
98
+ errors.push(...checkCompanionFiles(skill.companions, filteredSiblings));
99
+ errors.push(...checkCompanionsTokenParity(expandedBody, skill.companions));
100
+ if (errors.length > 0) {
101
+ throwInvariantViolations(srcPath, errors);
102
+ }
103
+ const existingRefs = await precomputeExistingRefs(expandedBody, skillDir);
104
+ const registry = buildRegistry(skill.companions, localIds, existingRefs, skillDir, owner);
105
+ const result = substitute(expandedBody, registry);
106
+ if (!result.ok) {
107
+ throwInvariantViolations(srcPath, result.errors);
108
+ }
109
+ await mkdir(dirname(outPath), { recursive: true });
110
+ await writeFile(outPath, renderFrontmatter(skill) + result.rendered);
111
+ return { resolvedIncludes: expanded.value.resolvedIncludes };
112
+ }
113
+ async function* walk(dir) {
114
+ const entries = await readdir(dir, { withFileTypes: true });
115
+ for (const entry of entries) {
116
+ const full = join(dir, entry.name);
117
+ if (entry.isDirectory())
118
+ yield* walk(full);
119
+ else if (entry.isFile())
120
+ yield full;
121
+ }
122
+ }
123
+ //# sourceMappingURL=emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/compile/emit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Companion, Skill } from "../skill/index.js";
2
+ export declare const COMPANIONS_PREFIX = "companions";
3
+ export declare function renderFrontmatter(skill: Skill): string;
4
+ export declare function renderCompanions(companions: readonly Companion[]): string;
5
+ export declare function checkCompanionsTokenParity(body: string, companions: readonly Companion[] | undefined): string[];
6
+ export declare function precomputeExistingRefs(body: string, skillDir: string): Promise<ReadonlySet<string>>;
7
+ //# sourceMappingURL=frontmatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/compile/frontmatter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1D,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAE9C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAMtD;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,CAKzE;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,GAC3C,MAAM,EAAE,CAUV;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAe9B"}
@@ -0,0 +1,44 @@
1
+ import { resolve } from "node:path";
2
+ import { dump } from "js-yaml";
3
+ import { pathExists } from "../fs.js";
4
+ import { parsePlaceholders } from "../placeholders/index.js";
5
+ export const COMPANIONS_PREFIX = "companions";
6
+ export function renderFrontmatter(skill) {
7
+ const lines = [`name: ${skill.name}`, `description: ${skill.description}`];
8
+ if (skill.companions?.length) {
9
+ lines.push(dump({ companions: skill.companions }).trimEnd());
10
+ }
11
+ return `---\n${lines.join("\n")}\n---\n\n`;
12
+ }
13
+ export function renderCompanions(companions) {
14
+ const bullets = companions.map((c) => `- \`${c.file}\` — ${c.summary}`).join("\n");
15
+ return `## Companion files (read on demand)
16
+
17
+ ${bullets}`;
18
+ }
19
+ export function checkCompanionsTokenParity(body, companions) {
20
+ const hasCompanions = (companions?.length ?? 0) > 0;
21
+ if (!hasCompanions)
22
+ return [];
23
+ const hasToken = parsePlaceholders(body).some((t) => t.prefix === COMPANIONS_PREFIX && t.value === null);
24
+ if (!hasToken) {
25
+ return [`companions declared but body is missing the {{${COMPANIONS_PREFIX}}} placeholder`];
26
+ }
27
+ return [];
28
+ }
29
+ export async function precomputeExistingRefs(body, skillDir) {
30
+ const refs = new Set();
31
+ const checks = [];
32
+ for (const token of parsePlaceholders(body)) {
33
+ if (token.prefix === "ref" && token.value !== null) {
34
+ const value = token.value;
35
+ checks.push(pathExists(resolve(skillDir, value)).then((exists) => {
36
+ if (exists)
37
+ refs.add(value);
38
+ }));
39
+ }
40
+ }
41
+ await Promise.all(checks);
42
+ return refs;
43
+ }
44
+ //# sourceMappingURL=frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/compile/frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAE9C,MAAM,UAAU,iBAAiB,CAAC,KAAY;IAC5C,MAAM,KAAK,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,EAAE,gBAAgB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3E,IAAI,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAgC;IAC/D,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnF,OAAO;;EAEP,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,IAAY,EACZ,UAA4C;IAE5C,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACpD,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,iBAAiB,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAC1D,CAAC;IACF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,iDAAiD,iBAAiB,gBAAgB,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAY,EACZ,QAAgB;IAEhB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAC1B,MAAM,CAAC,IAAI,CACT,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACnD,IAAI,MAAM;oBAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type BodyInvariant } from "./emit.js";
2
+ export type { BodyInvariant } from "./emit.js";
3
+ export interface CompileOptions {
4
+ readonly srcRoot: string;
5
+ readonly outRoot: string;
6
+ readonly bodyInvariants?: readonly BodyInvariant[];
7
+ }
8
+ export declare function compile(options: CompileOptions): Promise<void>;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/compile/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,aAAa,EAAqB,MAAM,WAAW,CAAC;AAY/E,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;CACpD;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAWpE"}
@@ -0,0 +1,123 @@
1
+ import { copyFile, mkdir, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { compileTree } from "./emit.js";
4
+ import { pathExists } from "../fs.js";
5
+ import { throwInvariantViolations } from "./discovery.js";
6
+ import { collectLocalIds, loadLayout, } from "../layout/index.js";
7
+ export async function compile(options) {
8
+ const { srcRoot, outRoot } = options;
9
+ const adapter = await loadAdapter(srcRoot);
10
+ const localIds = await collectLocalIds(adapter);
11
+ await checkContextFiles(adapter);
12
+ checkHookRequires(adapter, localIds);
13
+ await copyMarketplaceManifest(srcRoot, outRoot);
14
+ for (const plugin of adapter.plugins) {
15
+ await emitPlugin(plugin, outRoot, localIds, options.bodyInvariants ?? []);
16
+ }
17
+ }
18
+ async function loadAdapter(srcRoot) {
19
+ const result = await loadLayout(srcRoot);
20
+ if (result.ok)
21
+ return result.value;
22
+ const error = result.error;
23
+ switch (error.kind) {
24
+ case "marketplace-missing":
25
+ throw new Error(`marketplace.json not found at ${error.path}`);
26
+ case "marketplace-invalid":
27
+ return throwInvariantViolations(error.path, error.issues);
28
+ case "plugin-missing":
29
+ throw new Error(`plugin "${error.name}" not found at ${error.path}`);
30
+ case "manifest-missing":
31
+ return throwInvariantViolations(error.pluginDir, [
32
+ `plugin "${error.name}": no PLUGIN.ts or .claude-plugin/plugin.json`,
33
+ ]);
34
+ case "manifest-collision":
35
+ return throwInvariantViolations(join(error.pluginDir, "PLUGIN.ts"), [
36
+ `both PLUGIN.ts and .claude-plugin/plugin.json exist at ${error.pluginDir} — pick one`,
37
+ ]);
38
+ case "manifest-invalid":
39
+ return throwInvariantViolations(error.path, error.issues);
40
+ case "plugin-name-mismatch":
41
+ return throwInvariantViolations(error.path, [
42
+ `name "${error.manifestName}" does not match folder "${error.entryName}"`,
43
+ ]);
44
+ }
45
+ }
46
+ async function copyMarketplaceManifest(srcRoot, outRoot) {
47
+ const src = join(srcRoot, ".claude-plugin/marketplace.json");
48
+ const dst = join(outRoot, ".claude-plugin/marketplace.json");
49
+ await mkdir(join(outRoot, ".claude-plugin"), { recursive: true });
50
+ await copyFile(src, dst);
51
+ }
52
+ async function emitPlugin(plugin, outRoot, localIds, bodyInvariants) {
53
+ const pluginOutDir = join(outRoot, "plugins", plugin.name);
54
+ await emitPluginManifest(plugin, pluginOutDir);
55
+ const contextFiles = pluginContextFiles(plugin);
56
+ const owner = {
57
+ name: plugin.name,
58
+ dependencies: new Set(plugin.manifest.dependencies ?? []),
59
+ };
60
+ await compileTree({
61
+ srcRoot: plugin.pluginDir,
62
+ outRoot: pluginOutDir,
63
+ localIds,
64
+ bodyInvariants,
65
+ contextFiles,
66
+ owner,
67
+ });
68
+ }
69
+ async function emitPluginManifest(plugin, pluginOutDir) {
70
+ const target = join(pluginOutDir, ".claude-plugin/plugin.json");
71
+ await mkdir(join(pluginOutDir, ".claude-plugin"), { recursive: true });
72
+ await writeFile(target, JSON.stringify(toLegacyPluginJson(plugin.manifest), null, 2) + "\n");
73
+ }
74
+ function toLegacyPluginJson(plugin) {
75
+ const { context: _ctx, hookRequires: _hr, ...legacy } = plugin;
76
+ return legacy;
77
+ }
78
+ function pluginContextFiles(plugin) {
79
+ const result = new Set();
80
+ for (const entry of plugin.manifest.context ?? []) {
81
+ result.add(join(plugin.pluginDir, entry.file));
82
+ }
83
+ return result;
84
+ }
85
+ async function checkContextFiles(adapter) {
86
+ for (const plugin of adapter.plugins) {
87
+ const errors = [];
88
+ for (const entry of plugin.manifest.context ?? []) {
89
+ if (!(await pathExists(join(plugin.pluginDir, entry.file)))) {
90
+ errors.push(`context entry: file not found: ${entry.file}`);
91
+ }
92
+ }
93
+ if (errors.length > 0) {
94
+ throwInvariantViolations(join(plugin.pluginDir, "PLUGIN.ts"), errors);
95
+ }
96
+ }
97
+ }
98
+ function checkHookRequires(adapter, localIds) {
99
+ for (const plugin of adapter.plugins) {
100
+ const errors = [];
101
+ for (const req of plugin.manifest.hookRequires ?? []) {
102
+ const violation = hookRequireViolation(req, localIds);
103
+ if (violation)
104
+ errors.push(`hookRequires (${req.event}): ${violation}`);
105
+ }
106
+ if (errors.length > 0) {
107
+ throwInvariantViolations(join(plugin.pluginDir, "PLUGIN.ts"), errors);
108
+ }
109
+ }
110
+ }
111
+ function hookRequireViolation(req, localIds) {
112
+ if (req.skill !== undefined) {
113
+ return localIds.skills.has(req.skill) ? null : `${req.skill} is not a local skill`;
114
+ }
115
+ if (req.command !== undefined) {
116
+ return localIds.commands.has(req.command) ? null : `${req.command} is not a local command`;
117
+ }
118
+ if (req.agent !== undefined) {
119
+ return localIds.agents.has(req.agent) ? null : `${req.agent} is not a local agent`;
120
+ }
121
+ return null;
122
+ }
123
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/compile/index.ts"],"names":[],"mappings":"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"}