open-agreements 0.1.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 (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +161 -0
  3. package/bin/open-agreements.js +2 -0
  4. package/dist/cli/index.d.ts +2 -0
  5. package/dist/cli/index.d.ts.map +1 -0
  6. package/dist/cli/index.js +102 -0
  7. package/dist/cli/index.js.map +1 -0
  8. package/dist/commands/fill.d.ts +7 -0
  9. package/dist/commands/fill.d.ts.map +1 -0
  10. package/dist/commands/fill.js +84 -0
  11. package/dist/commands/fill.js.map +1 -0
  12. package/dist/commands/list.d.ts +6 -0
  13. package/dist/commands/list.d.ts.map +1 -0
  14. package/dist/commands/list.js +202 -0
  15. package/dist/commands/list.js.map +1 -0
  16. package/dist/commands/recipe.d.ts +21 -0
  17. package/dist/commands/recipe.d.ts.map +1 -0
  18. package/dist/commands/recipe.js +71 -0
  19. package/dist/commands/recipe.js.map +1 -0
  20. package/dist/commands/scan.d.ts +12 -0
  21. package/dist/commands/scan.d.ts.map +1 -0
  22. package/dist/commands/scan.js +122 -0
  23. package/dist/commands/scan.js.map +1 -0
  24. package/dist/commands/validate.d.ts +6 -0
  25. package/dist/commands/validate.d.ts.map +1 -0
  26. package/dist/commands/validate.js +139 -0
  27. package/dist/commands/validate.js.map +1 -0
  28. package/dist/core/command-generation/adapters/claude.d.ts +11 -0
  29. package/dist/core/command-generation/adapters/claude.d.ts.map +1 -0
  30. package/dist/core/command-generation/adapters/claude.js +85 -0
  31. package/dist/core/command-generation/adapters/claude.js.map +1 -0
  32. package/dist/core/command-generation/types.d.ts +14 -0
  33. package/dist/core/command-generation/types.d.ts.map +1 -0
  34. package/dist/core/command-generation/types.js +2 -0
  35. package/dist/core/command-generation/types.js.map +1 -0
  36. package/dist/core/engine.d.ts +13 -0
  37. package/dist/core/engine.d.ts.map +1 -0
  38. package/dist/core/engine.js +149 -0
  39. package/dist/core/engine.js.map +1 -0
  40. package/dist/core/external/index.d.ts +8 -0
  41. package/dist/core/external/index.d.ts.map +1 -0
  42. package/dist/core/external/index.js +92 -0
  43. package/dist/core/external/index.js.map +1 -0
  44. package/dist/core/external/types.d.ts +18 -0
  45. package/dist/core/external/types.d.ts.map +1 -0
  46. package/dist/core/external/types.js +2 -0
  47. package/dist/core/external/types.js.map +1 -0
  48. package/dist/core/fill-pipeline.d.ts +61 -0
  49. package/dist/core/fill-pipeline.d.ts.map +1 -0
  50. package/dist/core/fill-pipeline.js +279 -0
  51. package/dist/core/fill-pipeline.js.map +1 -0
  52. package/dist/core/fill-utils.d.ts +39 -0
  53. package/dist/core/fill-utils.d.ts.map +1 -0
  54. package/dist/core/fill-utils.js +127 -0
  55. package/dist/core/fill-utils.js.map +1 -0
  56. package/dist/core/metadata.d.ts +396 -0
  57. package/dist/core/metadata.d.ts.map +1 -0
  58. package/dist/core/metadata.js +126 -0
  59. package/dist/core/metadata.js.map +1 -0
  60. package/dist/core/recipe/cleaner.d.ts +13 -0
  61. package/dist/core/recipe/cleaner.d.ts.map +1 -0
  62. package/dist/core/recipe/cleaner.js +106 -0
  63. package/dist/core/recipe/cleaner.js.map +1 -0
  64. package/dist/core/recipe/downloader.d.ts +8 -0
  65. package/dist/core/recipe/downloader.d.ts.map +1 -0
  66. package/dist/core/recipe/downloader.js +58 -0
  67. package/dist/core/recipe/downloader.js.map +1 -0
  68. package/dist/core/recipe/index.d.ts +14 -0
  69. package/dist/core/recipe/index.d.ts.map +1 -0
  70. package/dist/core/recipe/index.js +91 -0
  71. package/dist/core/recipe/index.js.map +1 -0
  72. package/dist/core/recipe/ooxml-parts.d.ts +21 -0
  73. package/dist/core/recipe/ooxml-parts.d.ts.map +1 -0
  74. package/dist/core/recipe/ooxml-parts.js +33 -0
  75. package/dist/core/recipe/ooxml-parts.js.map +1 -0
  76. package/dist/core/recipe/patcher.d.ts +17 -0
  77. package/dist/core/recipe/patcher.d.ts.map +1 -0
  78. package/dist/core/recipe/patcher.js +240 -0
  79. package/dist/core/recipe/patcher.js.map +1 -0
  80. package/dist/core/recipe/types.d.ts +28 -0
  81. package/dist/core/recipe/types.d.ts.map +1 -0
  82. package/dist/core/recipe/types.js +2 -0
  83. package/dist/core/recipe/types.js.map +1 -0
  84. package/dist/core/recipe/verifier.d.ts +24 -0
  85. package/dist/core/recipe/verifier.d.ts.map +1 -0
  86. package/dist/core/recipe/verifier.js +143 -0
  87. package/dist/core/recipe/verifier.js.map +1 -0
  88. package/dist/core/validation/external.d.ts +16 -0
  89. package/dist/core/validation/external.d.ts.map +1 -0
  90. package/dist/core/validation/external.js +106 -0
  91. package/dist/core/validation/external.js.map +1 -0
  92. package/dist/core/validation/license.d.ts +15 -0
  93. package/dist/core/validation/license.d.ts.map +1 -0
  94. package/dist/core/validation/license.js +30 -0
  95. package/dist/core/validation/license.js.map +1 -0
  96. package/dist/core/validation/output.d.ts +12 -0
  97. package/dist/core/validation/output.d.ts.map +1 -0
  98. package/dist/core/validation/output.js +47 -0
  99. package/dist/core/validation/output.js.map +1 -0
  100. package/dist/core/validation/recipe.d.ts +19 -0
  101. package/dist/core/validation/recipe.d.ts.map +1 -0
  102. package/dist/core/validation/recipe.js +148 -0
  103. package/dist/core/validation/recipe.js.map +1 -0
  104. package/dist/core/validation/template.d.ts +11 -0
  105. package/dist/core/validation/template.d.ts.map +1 -0
  106. package/dist/core/validation/template.js +159 -0
  107. package/dist/core/validation/template.js.map +1 -0
  108. package/dist/index.d.ts +13 -0
  109. package/dist/index.d.ts.map +1 -0
  110. package/dist/index.js +19 -0
  111. package/dist/index.js.map +1 -0
  112. package/dist/utils/paths.d.ts +15 -0
  113. package/dist/utils/paths.d.ts.map +1 -0
  114. package/dist/utils/paths.js +43 -0
  115. package/dist/utils/paths.js.map +1 -0
  116. package/external/LICENSE +27 -0
  117. package/external/README.md +38 -0
  118. package/external/yc-safe-discount/README.md +16 -0
  119. package/external/yc-safe-discount/clean.json +4 -0
  120. package/external/yc-safe-discount/metadata.yaml +71 -0
  121. package/external/yc-safe-discount/replacements.json +13 -0
  122. package/external/yc-safe-discount/template.docx +0 -0
  123. package/external/yc-safe-mfn/README.md +16 -0
  124. package/external/yc-safe-mfn/clean.json +4 -0
  125. package/external/yc-safe-mfn/metadata.yaml +64 -0
  126. package/external/yc-safe-mfn/replacements.json +12 -0
  127. package/external/yc-safe-mfn/template.docx +0 -0
  128. package/external/yc-safe-pro-rata-side-letter/README.md +16 -0
  129. package/external/yc-safe-pro-rata-side-letter/clean.json +4 -0
  130. package/external/yc-safe-pro-rata-side-letter/metadata.yaml +49 -0
  131. package/external/yc-safe-pro-rata-side-letter/replacements.json +9 -0
  132. package/external/yc-safe-pro-rata-side-letter/template.docx +0 -0
  133. package/external/yc-safe-valuation-cap/README.md +16 -0
  134. package/external/yc-safe-valuation-cap/clean.json +4 -0
  135. package/external/yc-safe-valuation-cap/metadata.yaml +64 -0
  136. package/external/yc-safe-valuation-cap/replacements.json +12 -0
  137. package/external/yc-safe-valuation-cap/template.docx +0 -0
  138. package/package.json +77 -0
  139. package/recipes/nvca-certificate-of-incorporation/clean.json +8 -0
  140. package/recipes/nvca-certificate-of-incorporation/metadata.yaml +43 -0
  141. package/recipes/nvca-certificate-of-incorporation/replacements.json +9 -0
  142. package/recipes/nvca-certificate-of-incorporation/schema.json +11 -0
  143. package/recipes/nvca-indemnification-agreement/clean.json +7 -0
  144. package/recipes/nvca-indemnification-agreement/metadata.yaml +83 -0
  145. package/recipes/nvca-indemnification-agreement/replacements.json +17 -0
  146. package/recipes/nvca-indemnification-agreement/schema.json +19 -0
  147. package/recipes/nvca-investors-rights-agreement/clean.json +12 -0
  148. package/recipes/nvca-investors-rights-agreement/metadata.yaml +75 -0
  149. package/recipes/nvca-investors-rights-agreement/replacements.json +18 -0
  150. package/recipes/nvca-investors-rights-agreement/schema.json +18 -0
  151. package/recipes/nvca-management-rights-letter/clean.json +7 -0
  152. package/recipes/nvca-management-rights-letter/metadata.yaml +50 -0
  153. package/recipes/nvca-management-rights-letter/replacements.json +11 -0
  154. package/recipes/nvca-management-rights-letter/schema.json +13 -0
  155. package/recipes/nvca-rofr-co-sale-agreement/clean.json +7 -0
  156. package/recipes/nvca-rofr-co-sale-agreement/metadata.yaml +80 -0
  157. package/recipes/nvca-rofr-co-sale-agreement/replacements.json +17 -0
  158. package/recipes/nvca-rofr-co-sale-agreement/schema.json +19 -0
  159. package/recipes/nvca-stock-purchase-agreement/clean.json +10 -0
  160. package/recipes/nvca-stock-purchase-agreement/metadata.yaml +74 -0
  161. package/recipes/nvca-stock-purchase-agreement/replacements.json +20 -0
  162. package/recipes/nvca-stock-purchase-agreement/schema.json +19 -0
  163. package/recipes/nvca-voting-agreement/README.md +53 -0
  164. package/recipes/nvca-voting-agreement/clean.json +7 -0
  165. package/recipes/nvca-voting-agreement/metadata.yaml +70 -0
  166. package/recipes/nvca-voting-agreement/replacements.json +18 -0
  167. package/recipes/nvca-voting-agreement/schema.json +28 -0
  168. package/skills/open-agreements/SKILL.md +166 -0
  169. package/templates/bonterms-mutual-nda/README.md +27 -0
  170. package/templates/bonterms-mutual-nda/metadata.yaml +58 -0
  171. package/templates/bonterms-mutual-nda/template.docx +0 -0
  172. package/templates/bonterms-professional-services-agreement/README.md +24 -0
  173. package/templates/bonterms-professional-services-agreement/metadata.yaml +40 -0
  174. package/templates/bonterms-professional-services-agreement/template.docx +0 -0
  175. package/templates/common-paper-ai-addendum/README.md +23 -0
  176. package/templates/common-paper-ai-addendum/metadata.yaml +33 -0
  177. package/templates/common-paper-ai-addendum/template.docx +0 -0
  178. package/templates/common-paper-ai-addendum-in-app/README.md +21 -0
  179. package/templates/common-paper-ai-addendum-in-app/metadata.yaml +23 -0
  180. package/templates/common-paper-ai-addendum-in-app/template.docx +0 -0
  181. package/templates/common-paper-amendment/README.md +27 -0
  182. package/templates/common-paper-amendment/metadata.yaml +53 -0
  183. package/templates/common-paper-amendment/template.docx +0 -0
  184. package/templates/common-paper-business-associate-agreement/README.md +29 -0
  185. package/templates/common-paper-business-associate-agreement/metadata.yaml +63 -0
  186. package/templates/common-paper-business-associate-agreement/template.docx +0 -0
  187. package/templates/common-paper-cloud-service-agreement/README.md +32 -0
  188. package/templates/common-paper-cloud-service-agreement/metadata.yaml +488 -0
  189. package/templates/common-paper-cloud-service-agreement/template.docx +0 -0
  190. package/templates/common-paper-csa-click-through/README.md +33 -0
  191. package/templates/common-paper-csa-click-through/metadata.yaml +83 -0
  192. package/templates/common-paper-csa-click-through/template.docx +0 -0
  193. package/templates/common-paper-csa-with-ai/README.md +49 -0
  194. package/templates/common-paper-csa-with-ai/metadata.yaml +166 -0
  195. package/templates/common-paper-csa-with-ai/template.docx +0 -0
  196. package/templates/common-paper-csa-with-sla/README.md +53 -0
  197. package/templates/common-paper-csa-with-sla/metadata.yaml +185 -0
  198. package/templates/common-paper-csa-with-sla/template.docx +0 -0
  199. package/templates/common-paper-csa-without-sla/README.md +47 -0
  200. package/templates/common-paper-csa-without-sla/metadata.yaml +155 -0
  201. package/templates/common-paper-csa-without-sla/template.docx +0 -0
  202. package/templates/common-paper-data-processing-agreement/README.md +46 -0
  203. package/templates/common-paper-data-processing-agreement/metadata.yaml +149 -0
  204. package/templates/common-paper-data-processing-agreement/template.docx +0 -0
  205. package/templates/common-paper-design-partner-agreement/README.md +29 -0
  206. package/templates/common-paper-design-partner-agreement/metadata.yaml +65 -0
  207. package/templates/common-paper-design-partner-agreement/template.docx +0 -0
  208. package/templates/common-paper-independent-contractor-agreement/README.md +27 -0
  209. package/templates/common-paper-independent-contractor-agreement/metadata.yaml +55 -0
  210. package/templates/common-paper-independent-contractor-agreement/template.docx +0 -0
  211. package/templates/common-paper-letter-of-intent/README.md +25 -0
  212. package/templates/common-paper-letter-of-intent/metadata.yaml +43 -0
  213. package/templates/common-paper-letter-of-intent/template.docx +0 -0
  214. package/templates/common-paper-mutual-nda/README.md +29 -0
  215. package/templates/common-paper-mutual-nda/metadata.yaml +59 -0
  216. package/templates/common-paper-mutual-nda/template.docx +0 -0
  217. package/templates/common-paper-one-way-nda/README.md +27 -0
  218. package/templates/common-paper-one-way-nda/metadata.yaml +60 -0
  219. package/templates/common-paper-one-way-nda/template.docx +0 -0
  220. package/templates/common-paper-order-form/README.md +36 -0
  221. package/templates/common-paper-order-form/metadata.yaml +98 -0
  222. package/templates/common-paper-order-form/template.docx +0 -0
  223. package/templates/common-paper-order-form-with-sla/README.md +42 -0
  224. package/templates/common-paper-order-form-with-sla/metadata.yaml +129 -0
  225. package/templates/common-paper-order-form-with-sla/template.docx +0 -0
  226. package/templates/common-paper-partnership-agreement/README.md +34 -0
  227. package/templates/common-paper-partnership-agreement/metadata.yaml +90 -0
  228. package/templates/common-paper-partnership-agreement/template.docx +0 -0
  229. package/templates/common-paper-pilot-agreement/README.md +34 -0
  230. package/templates/common-paper-pilot-agreement/metadata.yaml +90 -0
  231. package/templates/common-paper-pilot-agreement/template.docx +0 -0
  232. package/templates/common-paper-professional-services-agreement/README.md +44 -0
  233. package/templates/common-paper-professional-services-agreement/metadata.yaml +141 -0
  234. package/templates/common-paper-professional-services-agreement/template.docx +0 -0
  235. package/templates/common-paper-software-license-agreement/README.md +18 -0
  236. package/templates/common-paper-software-license-agreement/metadata.yaml +13 -0
  237. package/templates/common-paper-software-license-agreement/template.docx +0 -0
  238. package/templates/common-paper-statement-of-work/README.md +32 -0
  239. package/templates/common-paper-statement-of-work/metadata.yaml +78 -0
  240. package/templates/common-paper-statement-of-work/template.docx +0 -0
  241. package/templates/common-paper-term-sheet/README.md +22 -0
  242. package/templates/common-paper-term-sheet/metadata.yaml +28 -0
  243. package/templates/common-paper-term-sheet/template.docx +0 -0
@@ -0,0 +1,21 @@
1
+ export interface RecipeRunArgs {
2
+ recipeId: string;
3
+ input?: string;
4
+ output?: string;
5
+ data?: string;
6
+ keepIntermediate?: boolean;
7
+ }
8
+ export declare function runRecipeCommand(args: RecipeRunArgs): Promise<void>;
9
+ export interface RecipeCleanArgs {
10
+ input: string;
11
+ output: string;
12
+ recipe: string;
13
+ }
14
+ export declare function runRecipeClean(args: RecipeCleanArgs): Promise<void>;
15
+ export interface RecipePatchArgs {
16
+ input: string;
17
+ output: string;
18
+ recipe: string;
19
+ }
20
+ export declare function runRecipePatch(args: RecipePatchArgs): Promise<void>;
21
+ //# sourceMappingURL=recipe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../src/commands/recipe.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCzE;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAWzE;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAYzE"}
@@ -0,0 +1,71 @@
1
+ import { resolve } from 'node:path';
2
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
3
+ import { runRecipe, cleanDocument, patchDocument } from '../core/recipe/index.js';
4
+ import { loadCleanConfig } from '../core/metadata.js';
5
+ import { getRecipesDir, resolveRecipeDir } from '../utils/paths.js';
6
+ export async function runRecipeCommand(args) {
7
+ const recipeDir = resolveRecipeDir(args.recipeId);
8
+ if (!existsSync(recipeDir)) {
9
+ const available = getAvailableRecipes();
10
+ console.error(`Recipe "${args.recipeId}" not found.`);
11
+ if (available.length > 0) {
12
+ console.error(`Available recipes: ${available.join(', ')}`);
13
+ }
14
+ process.exit(1);
15
+ }
16
+ let values = {};
17
+ if (args.data) {
18
+ values = JSON.parse(readFileSync(args.data, 'utf-8'));
19
+ }
20
+ const outputPath = resolve(args.output ?? `${args.recipeId}-filled.docx`);
21
+ try {
22
+ const result = await runRecipe({
23
+ recipeId: args.recipeId,
24
+ inputPath: args.input ? resolve(args.input) : undefined,
25
+ outputPath,
26
+ values,
27
+ keepIntermediate: args.keepIntermediate,
28
+ });
29
+ console.log(`Filled ${result.metadata.name}`);
30
+ console.log(`Output: ${result.outputPath}`);
31
+ console.log(`Fields used: ${result.fieldsUsed.join(', ')}`);
32
+ }
33
+ catch (err) {
34
+ console.error(`Error: ${err.message}`);
35
+ process.exit(1);
36
+ }
37
+ }
38
+ export async function runRecipeClean(args) {
39
+ const recipeDir = resolveRecipeDir(args.recipe);
40
+ const config = loadCleanConfig(recipeDir);
41
+ try {
42
+ await cleanDocument(resolve(args.input), resolve(args.output), config);
43
+ console.log(`Cleaned: ${args.output}`);
44
+ }
45
+ catch (err) {
46
+ console.error(`Error: ${err.message}`);
47
+ process.exit(1);
48
+ }
49
+ }
50
+ export async function runRecipePatch(args) {
51
+ const recipeDir = resolveRecipeDir(args.recipe);
52
+ const replacementsPath = resolve(recipeDir, 'replacements.json');
53
+ const replacements = JSON.parse(readFileSync(replacementsPath, 'utf-8'));
54
+ try {
55
+ await patchDocument(resolve(args.input), resolve(args.output), replacements);
56
+ console.log(`Patched: ${args.output}`);
57
+ }
58
+ catch (err) {
59
+ console.error(`Error: ${err.message}`);
60
+ process.exit(1);
61
+ }
62
+ }
63
+ function getAvailableRecipes() {
64
+ const recipesDir = getRecipesDir();
65
+ if (!existsSync(recipesDir))
66
+ return [];
67
+ return readdirSync(recipesDir, { withFileTypes: true })
68
+ .filter((d) => d.isDirectory())
69
+ .map((d) => d.name);
70
+ }
71
+ //# sourceMappingURL=recipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe.js","sourceRoot":"","sources":["../../src/commands/recipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAUpE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAmB;IACxD,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAElD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,QAAQ,cAAc,CAAC,CAAC;QACtD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,sBAAsB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,GAA2B,EAAE,CAAC;IACxC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,cAAc,CAAC,CAAC;IAE1E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC;YAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;YACvD,UAAU;YACV,MAAM;YACN,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;SACxC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,UAAW,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAqB;IACxD,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAE1C,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,UAAW,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAqB;IACxD,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IACjE,MAAM,YAAY,GAA2B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;IAEjG,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,UAAW,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO,WAAW,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SACpD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Scan a DOCX file and report all bracketed placeholders.
3
+ * Classifies them as short (fill-in fields) vs long (alternative clauses).
4
+ * Optionally outputs a draft replacements.json.
5
+ *
6
+ * Scans all general OOXML text parts (document, headers, footers, endnotes).
7
+ */
8
+ export declare function runScan(args: {
9
+ input: string;
10
+ outputReplacements?: string;
11
+ }): void;
12
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA4FlF"}
@@ -0,0 +1,122 @@
1
+ import { existsSync, writeFileSync } from 'node:fs';
2
+ import AdmZip from 'adm-zip';
3
+ import { enumerateTextParts, getGeneralTextPartNames } from '../core/recipe/ooxml-parts.js';
4
+ /**
5
+ * Scan a DOCX file and report all bracketed placeholders.
6
+ * Classifies them as short (fill-in fields) vs long (alternative clauses).
7
+ * Optionally outputs a draft replacements.json.
8
+ *
9
+ * Scans all general OOXML text parts (document, headers, footers, endnotes).
10
+ */
11
+ export function runScan(args) {
12
+ if (!existsSync(args.input)) {
13
+ console.error(`File not found: ${args.input}`);
14
+ process.exit(1);
15
+ }
16
+ const zip = new AdmZip(args.input);
17
+ const parts = enumerateTextParts(zip);
18
+ const partNames = getGeneralTextPartNames(parts);
19
+ // Collect bracketed content from all parts, tracking which part they appear in
20
+ const bracketsByPart = new Map();
21
+ const allBrackets = [];
22
+ for (const partName of partNames) {
23
+ const text = extractPartText(zip, partName);
24
+ const brackets = [...text.matchAll(/\[([^\]]+)\]/g)].map((m) => m[1]);
25
+ if (brackets.length > 0) {
26
+ bracketsByPart.set(partName, new Set(brackets));
27
+ allBrackets.push(...brackets);
28
+ }
29
+ }
30
+ const unique = [...new Set(allBrackets)].sort();
31
+ const shortPlaceholders = [];
32
+ const longClauses = [];
33
+ for (const b of unique) {
34
+ if (b.length <= 80) {
35
+ shortPlaceholders.push(`[${b}]`);
36
+ }
37
+ else {
38
+ longClauses.push(`[${b.slice(0, 60)}...]`);
39
+ }
40
+ }
41
+ console.log(`\n=== Scan of ${args.input} ===`);
42
+ // Report parts scanned
43
+ const nonDocParts = partNames.filter((p) => p !== 'word/document.xml');
44
+ if (nonDocParts.length > 0) {
45
+ console.log(`Parts scanned: document.xml + ${nonDocParts.length} additional (${nonDocParts.join(', ')})`);
46
+ }
47
+ console.log(`\nShort placeholders (${shortPlaceholders.length}):`);
48
+ for (const p of shortPlaceholders) {
49
+ // Note which parts contain this placeholder (if outside document.xml)
50
+ const inner = p.slice(1, -1);
51
+ const locations = [];
52
+ for (const [partName, brackets] of bracketsByPart) {
53
+ if (partName !== 'word/document.xml' && brackets.has(inner)) {
54
+ locations.push(partName.replace('word/', ''));
55
+ }
56
+ }
57
+ const suffix = locations.length > 0 ? ` (also in: ${locations.join(', ')})` : '';
58
+ console.log(` ${p}${suffix}`);
59
+ }
60
+ console.log(`\nLong clauses/alternatives (${longClauses.length}) — skipped by recipe:`);
61
+ for (const c of longClauses) {
62
+ console.log(` ${c}`);
63
+ }
64
+ // Footnote count
65
+ const footnoteCount = countFootnotes(zip);
66
+ console.log(`\nFootnotes: ${footnoteCount} explanatory footnote(s)`);
67
+ // Underscore blanks (from all parts)
68
+ let totalBlanks = 0;
69
+ for (const partName of partNames) {
70
+ const text = extractPartText(zip, partName);
71
+ const blanks = text.match(/_{3,}/g) ?? [];
72
+ totalBlanks += blanks.length;
73
+ }
74
+ console.log(`Underscore blanks: ${totalBlanks} occurrence(s)`);
75
+ // Output draft replacements.json
76
+ if (args.outputReplacements) {
77
+ const replacements = {};
78
+ for (const p of shortPlaceholders) {
79
+ const inner = p.slice(1, -1);
80
+ const tagName = inner
81
+ .toLowerCase()
82
+ .replace(/[^a-z0-9]+/g, '_')
83
+ .replace(/^_|_$/g, '');
84
+ replacements[p] = `{${tagName}}`;
85
+ }
86
+ writeFileSync(args.outputReplacements, JSON.stringify(replacements, null, 2) + '\n');
87
+ console.log(`\nDraft replacements written to: ${args.outputReplacements}`);
88
+ }
89
+ console.log('');
90
+ }
91
+ function extractPartText(zip, partName) {
92
+ const entry = zip.getEntry(partName);
93
+ if (!entry)
94
+ return '';
95
+ const xml = entry.getData().toString('utf-8');
96
+ const paragraphs = [];
97
+ const paraRegex = /<w:p[\s>][\s\S]*?<\/w:p>/g;
98
+ let paraMatch;
99
+ while ((paraMatch = paraRegex.exec(xml)) !== null) {
100
+ const paraXml = paraMatch[0];
101
+ const textParts = [];
102
+ const tRegex = /<w:t[^>]*>([^<]*)<\/w:t>/g;
103
+ let tMatch;
104
+ while ((tMatch = tRegex.exec(paraXml)) !== null) {
105
+ textParts.push(tMatch[1]);
106
+ }
107
+ if (textParts.length > 0) {
108
+ paragraphs.push(textParts.join(''));
109
+ }
110
+ }
111
+ return paragraphs.join('\n');
112
+ }
113
+ function countFootnotes(zip) {
114
+ const entry = zip.getEntry('word/footnotes.xml');
115
+ if (!entry)
116
+ return 0;
117
+ const xml = entry.getData().toString('utf-8');
118
+ const all = xml.match(/<w:footnote\s/g) ?? [];
119
+ const separators = xml.match(/w:type="(separator|continuationSeparator)"/g) ?? [];
120
+ return all.length - separators.length;
121
+ }
122
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface ValidateArgs {
2
+ template?: string;
3
+ strict?: boolean;
4
+ }
5
+ export declare function runValidate(args: ValidateArgs): void;
6
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAsBpD"}
@@ -0,0 +1,139 @@
1
+ import { readdirSync, existsSync } from 'node:fs';
2
+ import { validateMetadata } from '../core/metadata.js';
3
+ import { validateTemplate } from '../core/validation/template.js';
4
+ import { validateLicense } from '../core/validation/license.js';
5
+ import { validateRecipe } from '../core/validation/recipe.js';
6
+ import { validateExternal } from '../core/validation/external.js';
7
+ import { getTemplatesDir, resolveTemplateDir, getRecipesDir, resolveRecipeDir, getExternalDir, resolveExternalDir } from '../utils/paths.js';
8
+ export function runValidate(args) {
9
+ let hasErrors = false;
10
+ // Validate templates
11
+ hasErrors = validateTemplates(args) || hasErrors;
12
+ // Validate external templates (unless a specific template was requested)
13
+ if (!args.template) {
14
+ hasErrors = validateExternalTemplates() || hasErrors;
15
+ }
16
+ // Validate recipes (unless a specific template was requested)
17
+ if (!args.template) {
18
+ hasErrors = validateRecipes(args) || hasErrors;
19
+ }
20
+ if (hasErrors) {
21
+ console.error('Validation FAILED');
22
+ process.exit(1);
23
+ }
24
+ else {
25
+ console.log('Validation PASSED');
26
+ }
27
+ }
28
+ function validateTemplates(args) {
29
+ const templatesDir = getTemplatesDir();
30
+ let templateIds;
31
+ if (args.template) {
32
+ templateIds = [args.template];
33
+ }
34
+ else {
35
+ if (!existsSync(templatesDir)) {
36
+ console.log('No templates directory found.');
37
+ return false;
38
+ }
39
+ templateIds = readdirSync(templatesDir, { withFileTypes: true })
40
+ .filter((d) => d.isDirectory())
41
+ .map((d) => d.name);
42
+ }
43
+ let hasErrors = false;
44
+ for (const id of templateIds) {
45
+ const dir = resolveTemplateDir(id);
46
+ console.log(`\nValidating template: ${id}`);
47
+ const metaResult = validateMetadata(dir);
48
+ if (!metaResult.valid) {
49
+ hasErrors = true;
50
+ console.error(` FAIL metadata: ${metaResult.errors.join('; ')}`);
51
+ }
52
+ else {
53
+ console.log(' PASS metadata');
54
+ }
55
+ const tmplResult = validateTemplate(dir, id);
56
+ if (!tmplResult.valid) {
57
+ hasErrors = true;
58
+ for (const e of tmplResult.errors)
59
+ console.error(` FAIL template: ${e}`);
60
+ }
61
+ else {
62
+ console.log(' PASS template');
63
+ }
64
+ for (const w of tmplResult.warnings)
65
+ console.log(` WARN template: ${w}`);
66
+ const licResult = validateLicense(dir, id);
67
+ if (!licResult.valid) {
68
+ hasErrors = true;
69
+ for (const e of licResult.errors)
70
+ console.error(` FAIL license: ${e}`);
71
+ }
72
+ else {
73
+ console.log(' PASS license');
74
+ }
75
+ }
76
+ console.log(`\n${templateIds.length} template(s) validated.`);
77
+ return hasErrors;
78
+ }
79
+ function validateExternalTemplates() {
80
+ const externalDir = getExternalDir();
81
+ if (!existsSync(externalDir)) {
82
+ return false;
83
+ }
84
+ const externalIds = readdirSync(externalDir, { withFileTypes: true })
85
+ .filter((d) => d.isDirectory())
86
+ .map((d) => d.name);
87
+ if (externalIds.length === 0) {
88
+ return false;
89
+ }
90
+ let hasErrors = false;
91
+ for (const id of externalIds) {
92
+ const dir = resolveExternalDir(id);
93
+ console.log(`\nValidating external: ${id}`);
94
+ const result = validateExternal(dir, id);
95
+ if (!result.valid) {
96
+ hasErrors = true;
97
+ for (const e of result.errors)
98
+ console.error(` FAIL: ${e}`);
99
+ }
100
+ else {
101
+ console.log(' PASS');
102
+ }
103
+ for (const w of result.warnings)
104
+ console.log(` WARN: ${w}`);
105
+ }
106
+ console.log(`\n${externalIds.length} external template(s) validated.`);
107
+ return hasErrors;
108
+ }
109
+ function validateRecipes(args) {
110
+ const recipesDir = getRecipesDir();
111
+ if (!existsSync(recipesDir)) {
112
+ return false;
113
+ }
114
+ const recipeIds = readdirSync(recipesDir, { withFileTypes: true })
115
+ .filter((d) => d.isDirectory())
116
+ .map((d) => d.name);
117
+ if (recipeIds.length === 0) {
118
+ return false;
119
+ }
120
+ let hasErrors = false;
121
+ for (const id of recipeIds) {
122
+ const dir = resolveRecipeDir(id);
123
+ console.log(`\nValidating recipe: ${id}`);
124
+ const result = validateRecipe(dir, id, { strict: args.strict });
125
+ if (!result.valid) {
126
+ hasErrors = true;
127
+ for (const e of result.errors)
128
+ console.error(` FAIL: ${e}`);
129
+ }
130
+ else {
131
+ console.log(` PASS${result.scaffold ? ' (scaffold)' : ''}`);
132
+ }
133
+ for (const w of result.warnings)
134
+ console.log(` WARN: ${w}`);
135
+ }
136
+ console.log(`\n${recipeIds.length} recipe(s) validated.`);
137
+ return hasErrors;
138
+ }
139
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ToolCommandAdapter } from '../types.js';
2
+ import type { TemplateMetadata } from '../../metadata.js';
3
+ export declare class ClaudeCodeAdapter implements ToolCommandAdapter {
4
+ readonly name = "claude-code";
5
+ generateSkillFile(metadata: TemplateMetadata, templateId: string): string;
6
+ getOutputPath(_templateId: string): string;
7
+ private groupFieldsBySection;
8
+ private buildQuestionRounds;
9
+ private formatRound;
10
+ }
11
+ //# sourceMappingURL=claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../../src/core/command-generation/adapters/claude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,qBAAa,iBAAkB,YAAW,kBAAkB;IAC1D,QAAQ,CAAC,IAAI,iBAAiB;IAE9B,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IA2CzE,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAI1C,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,mBAAmB;IA0B3B,OAAO,CAAC,WAAW;CAapB"}
@@ -0,0 +1,85 @@
1
+ export class ClaudeCodeAdapter {
2
+ name = 'claude-code';
3
+ generateSkillFile(metadata, templateId) {
4
+ const fieldsBySection = this.groupFieldsBySection(metadata);
5
+ const questionRounds = this.buildQuestionRounds(fieldsBySection);
6
+ return `# OpenAgreements: Fill ${metadata.name}
7
+
8
+ Fill the **${metadata.name}** template with user-provided values and render a DOCX file.
9
+
10
+ Source: ${metadata.source_url}
11
+ License: ${metadata.license}
12
+ ${metadata.attribution_text}
13
+
14
+ ## Instructions
15
+
16
+ 1. Greet the user and explain you'll help them fill out a ${metadata.name}.
17
+ 2. Collect field values using AskUserQuestion in multiple rounds (up to 4 questions each).
18
+ 3. After collecting all values, run the template engine to produce the filled DOCX.
19
+
20
+ ## Field Collection Rounds
21
+
22
+ ${questionRounds}
23
+
24
+ ## Execution
25
+
26
+ After collecting all field values, run:
27
+
28
+ \`\`\`bash
29
+ open-agreements fill ${templateId} ${metadata.fields
30
+ .filter((f) => f.required)
31
+ .map((f) => `--${f.name} "\${${f.name}}"`)
32
+ .join(' ')}
33
+ \`\`\`
34
+
35
+ The filled DOCX will be saved to the current directory.
36
+
37
+ ## Important
38
+
39
+ - All fields should be confirmed with the user before rendering.
40
+ - If the user is unsure about a field (e.g., governing law), suggest common defaults.
41
+ - This template is licensed under ${metadata.license}. ${metadata.attribution_text}
42
+ `;
43
+ }
44
+ getOutputPath(_templateId) {
45
+ return '.claude/commands/open-agreements.md';
46
+ }
47
+ groupFieldsBySection(metadata) {
48
+ const sections = new Map();
49
+ for (const field of metadata.fields) {
50
+ const section = field.section ?? 'General';
51
+ if (!sections.has(section))
52
+ sections.set(section, []);
53
+ sections.get(section).push(field);
54
+ }
55
+ return sections;
56
+ }
57
+ buildQuestionRounds(fieldsBySection) {
58
+ let round = 1;
59
+ let output = '';
60
+ let currentBatch = [];
61
+ for (const [section, fields] of fieldsBySection) {
62
+ for (const field of fields) {
63
+ currentBatch.push(field);
64
+ if (currentBatch.length === 4) {
65
+ output += this.formatRound(round, section, currentBatch);
66
+ round++;
67
+ currentBatch = [];
68
+ }
69
+ }
70
+ if (currentBatch.length > 0) {
71
+ output += this.formatRound(round, section, currentBatch);
72
+ round++;
73
+ currentBatch = [];
74
+ }
75
+ }
76
+ return output;
77
+ }
78
+ formatRound(round, section, fields) {
79
+ const fieldList = fields
80
+ .map((f) => ` - **${f.name}** (${f.type}${f.required ? ', required' : ', optional'}): ${f.description}`)
81
+ .join('\n');
82
+ return `### Round ${round}: ${section}\n${fieldList}\n\n`;
83
+ }
84
+ }
85
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../../src/core/command-generation/adapters/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { TemplateMetadata } from '../metadata.js';
2
+ /**
3
+ * Adapter interface for generating agent-specific skill files from template metadata.
4
+ * Implement this interface to support new coding agents (Cursor, Windsurf, etc.).
5
+ */
6
+ export interface ToolCommandAdapter {
7
+ /** Unique name for this adapter (e.g., 'claude-code', 'cursor') */
8
+ readonly name: string;
9
+ /** Generate the skill/command file content for this agent */
10
+ generateSkillFile(metadata: TemplateMetadata, templateId: string): string;
11
+ /** Generate the output file path for the skill file */
12
+ getOutputPath(templateId: string): string;
13
+ }
14
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/command-generation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,6DAA6D;IAC7D,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAE1E,uDAAuD;IACvD,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/command-generation/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import { type TemplateMetadata } from './metadata.js';
2
+ export interface FillOptions {
3
+ templateDir: string;
4
+ values: Record<string, string | boolean>;
5
+ outputPath: string;
6
+ }
7
+ export interface FillResult {
8
+ outputPath: string;
9
+ metadata: TemplateMetadata;
10
+ fieldsUsed: string[];
11
+ }
12
+ export declare function fillTemplate(options: FillOptions): Promise<FillResult>;
13
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/core/engine.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAIpE,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;IACzC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AA6GD,wBAAsB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAgD5E"}