open-agreements 0.7.5 → 0.7.7

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 (215) hide show
  1. package/README.de.md +300 -255
  2. package/README.es.md +301 -254
  3. package/README.md +389 -95
  4. package/README.pt-br.md +301 -254
  5. package/README.template.md +333 -0
  6. package/README.zh.md +300 -253
  7. package/SECURITY.md +34 -0
  8. package/content/recipes/nvca-stock-purchase-agreement/README.md +39 -0
  9. package/content/recipes/nvca-voting-agreement/README.md +43 -0
  10. package/content/templates/bonterms-mutual-nda/README.md +2 -2
  11. package/content/templates/bonterms-mutual-nda/metadata.yaml +5 -11
  12. package/content/templates/bonterms-professional-services-agreement/README.md +2 -2
  13. package/content/templates/bonterms-professional-services-agreement/metadata.yaml +2 -2
  14. package/content/templates/closing-checklist/template.docx +0 -0
  15. package/content/templates/closing-checklist/template.md +30 -0
  16. package/content/templates/common-paper-ai-addendum/template.docx +0 -0
  17. package/content/templates/common-paper-ai-addendum-in-app/template.docx +0 -0
  18. package/content/templates/common-paper-csa-with-ai/template.docx +0 -0
  19. package/content/templates/common-paper-independent-contractor-agreement/template.docx +0 -0
  20. package/content/templates/common-paper-mutual-nda/README.md +28 -0
  21. package/content/templates/common-paper-one-way-nda/metadata.yaml +1 -1
  22. package/content/templates/common-paper-term-sheet/template.docx +0 -0
  23. package/content/templates/openagreements-board-consent-safe/.template.generated.json +74 -0
  24. package/content/templates/openagreements-board-consent-safe/README.md +61 -0
  25. package/content/templates/openagreements-board-consent-safe/metadata.yaml +53 -0
  26. package/content/templates/openagreements-board-consent-safe/reference-source.docx +0 -0
  27. package/content/templates/openagreements-board-consent-safe/template.docx +0 -0
  28. package/content/templates/openagreements-board-consent-safe/template.md +66 -0
  29. package/content/templates/openagreements-due-diligence-request-list/README.md +68 -0
  30. package/content/templates/openagreements-due-diligence-request-list/metadata.yaml +300 -0
  31. package/content/templates/openagreements-due-diligence-request-list/template.docx +0 -0
  32. package/content/templates/openagreements-due-diligence-request-list/template.md +318 -0
  33. package/content/templates/openagreements-employee-ip-inventions-assignment/.template.generated.json +230 -0
  34. package/content/templates/openagreements-employee-ip-inventions-assignment/metadata.yaml +1 -1
  35. package/content/templates/openagreements-employee-ip-inventions-assignment/template.docx +0 -0
  36. package/content/templates/openagreements-employee-ip-inventions-assignment/template.md +96 -35
  37. package/content/templates/openagreements-employment-confidentiality-acknowledgement/README.md +1 -1
  38. package/content/templates/openagreements-employment-confidentiality-acknowledgement/metadata.yaml +2 -2
  39. package/content/templates/openagreements-employment-confidentiality-acknowledgement/template.docx +0 -0
  40. package/content/templates/openagreements-employment-confidentiality-acknowledgement/template.json +75 -0
  41. package/content/templates/openagreements-employment-confidentiality-acknowledgement/template.md +8 -4
  42. package/content/templates/openagreements-employment-offer-letter/.template.generated.json +224 -0
  43. package/content/templates/openagreements-employment-offer-letter/README.md +65 -1
  44. package/content/templates/openagreements-employment-offer-letter/metadata.yaml +1 -1
  45. package/content/templates/openagreements-employment-offer-letter/template.docx +0 -0
  46. package/content/templates/openagreements-employment-offer-letter/template.md +70 -30
  47. package/content/templates/openagreements-restrictive-covenant-florida/.template.generated.json +456 -0
  48. package/content/templates/openagreements-restrictive-covenant-florida/README.md +141 -0
  49. package/content/templates/openagreements-restrictive-covenant-florida/metadata.yaml +419 -0
  50. package/content/templates/openagreements-restrictive-covenant-florida/template.docx +0 -0
  51. package/content/templates/openagreements-restrictive-covenant-florida/template.md +233 -0
  52. package/content/templates/openagreements-restrictive-covenant-wyoming/.template.generated.json +399 -0
  53. package/content/templates/openagreements-restrictive-covenant-wyoming/metadata.yaml +69 -12
  54. package/content/templates/openagreements-restrictive-covenant-wyoming/template.docx +0 -0
  55. package/content/templates/openagreements-restrictive-covenant-wyoming/template.md +110 -59
  56. package/content/templates/openagreements-stockholder-consent-safe/.template.generated.json +74 -0
  57. package/content/templates/openagreements-stockholder-consent-safe/README.md +62 -0
  58. package/content/templates/openagreements-stockholder-consent-safe/metadata.yaml +53 -0
  59. package/content/templates/openagreements-stockholder-consent-safe/reference-source.docx +0 -0
  60. package/content/templates/openagreements-stockholder-consent-safe/template.docx +0 -0
  61. package/content/templates/openagreements-stockholder-consent-safe/template.md +62 -0
  62. package/content/templates/working-group-list/template.docx +0 -0
  63. package/content/templates/working-group-list/template.md +18 -0
  64. package/dist/cli/index.js.map +1 -1
  65. package/dist/commands/fill.d.ts +1 -1
  66. package/dist/commands/fill.d.ts.map +1 -1
  67. package/dist/commands/fill.js +4 -1
  68. package/dist/commands/fill.js.map +1 -1
  69. package/dist/commands/list.js +10 -0
  70. package/dist/commands/list.js.map +1 -1
  71. package/dist/commands/recipe.js.map +1 -1
  72. package/dist/core/employment/jurisdiction-rules.js +2 -2
  73. package/dist/core/employment/jurisdiction-rules.js.map +1 -1
  74. package/dist/core/employment/memo.d.ts +1 -1
  75. package/dist/core/employment/memo.d.ts.map +1 -1
  76. package/dist/core/employment/memo.js +14 -6
  77. package/dist/core/employment/memo.js.map +1 -1
  78. package/dist/core/engine.d.ts.map +1 -1
  79. package/dist/core/engine.js +28 -0
  80. package/dist/core/engine.js.map +1 -1
  81. package/dist/core/fill-pipeline.d.ts +30 -5
  82. package/dist/core/fill-pipeline.d.ts.map +1 -1
  83. package/dist/core/fill-pipeline.js +165 -9
  84. package/dist/core/fill-pipeline.js.map +1 -1
  85. package/dist/core/humanize-docx.d.ts +21 -0
  86. package/dist/core/humanize-docx.d.ts.map +1 -0
  87. package/dist/core/humanize-docx.js +492 -0
  88. package/dist/core/humanize-docx.js.map +1 -0
  89. package/dist/core/metadata.d.ts +118 -65
  90. package/dist/core/metadata.d.ts.map +1 -1
  91. package/dist/core/metadata.js +268 -13
  92. package/dist/core/metadata.js.map +1 -1
  93. package/dist/core/recipe/bracket-normalizer.d.ts +1 -1
  94. package/dist/core/recipe/bracket-normalizer.d.ts.map +1 -1
  95. package/dist/core/recipe/bracket-normalizer.js +3 -0
  96. package/dist/core/recipe/bracket-normalizer.js.map +1 -1
  97. package/dist/core/recipe/computed.d.ts +1 -1
  98. package/dist/core/recipe/computed.d.ts.map +1 -1
  99. package/dist/core/recipe/index.d.ts.map +1 -1
  100. package/dist/core/recipe/index.js +22 -4
  101. package/dist/core/recipe/index.js.map +1 -1
  102. package/dist/core/recipe/types.d.ts +1 -1
  103. package/dist/core/recipe/types.d.ts.map +1 -1
  104. package/dist/core/template-listing.d.ts +6 -8
  105. package/dist/core/template-listing.d.ts.map +1 -1
  106. package/dist/core/template-listing.js +24 -0
  107. package/dist/core/template-listing.js.map +1 -1
  108. package/dist/core/unified-pipeline.d.ts +2 -0
  109. package/dist/core/unified-pipeline.d.ts.map +1 -1
  110. package/dist/core/unified-pipeline.js +17 -1
  111. package/dist/core/unified-pipeline.js.map +1 -1
  112. package/dist/core/validation/template.d.ts +32 -0
  113. package/dist/core/validation/template.d.ts.map +1 -1
  114. package/dist/core/validation/template.js +163 -3
  115. package/dist/core/validation/template.js.map +1 -1
  116. package/dist/index.d.ts +1 -0
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +2 -0
  119. package/dist/index.js.map +1 -1
  120. package/gemini-extension.json +1 -1
  121. package/package.json +26 -12
  122. package/skills/canonical-markdown-authoring/CONNECTORS.md +67 -0
  123. package/skills/canonical-markdown-authoring/SKILL.md +565 -0
  124. package/skills/client-email/SKILL.md +10 -6
  125. package/skills/cloud-service-agreement/CONNECTORS.md +2 -2
  126. package/skills/cloud-service-agreement/SKILL.md +38 -1
  127. package/skills/cloud-service-agreement/template-filling-execution.md +2 -2
  128. package/skills/data-privacy-agreement/CONNECTORS.md +2 -2
  129. package/skills/data-privacy-agreement/SKILL.md +2 -0
  130. package/skills/delaware-franchise-tax/SKILL.md +2 -0
  131. package/skills/edit-docx-agreement/SKILL.md +2 -0
  132. package/skills/employment-contract/CONNECTORS.md +2 -2
  133. package/skills/employment-contract/SKILL.md +25 -6
  134. package/skills/iso-27001-evidence-collection/SKILL.md +2 -0
  135. package/skills/iso-27001-internal-audit/SKILL.md +2 -0
  136. package/skills/nda/CONNECTORS.md +2 -2
  137. package/skills/nda/SKILL.md +45 -1
  138. package/skills/nda/template-filling-execution.md +12 -6
  139. package/skills/non-compete-contract-explainer/SKILL.md +107 -0
  140. package/skills/non-compete-contract-explainer/content/alabama.md +251 -0
  141. package/skills/non-compete-contract-explainer/content/alaska.md +160 -0
  142. package/skills/non-compete-contract-explainer/content/american-samoa.md +187 -0
  143. package/skills/non-compete-contract-explainer/content/arizona.md +293 -0
  144. package/skills/non-compete-contract-explainer/content/arkansas.md +235 -0
  145. package/skills/non-compete-contract-explainer/content/california.md +270 -0
  146. package/skills/non-compete-contract-explainer/content/cnmi.md +168 -0
  147. package/skills/non-compete-contract-explainer/content/colorado.md +277 -0
  148. package/skills/non-compete-contract-explainer/content/connecticut.md +220 -0
  149. package/skills/non-compete-contract-explainer/content/delaware.md +222 -0
  150. package/skills/non-compete-contract-explainer/content/district-of-columbia.md +263 -0
  151. package/skills/non-compete-contract-explainer/content/florida.md +267 -0
  152. package/skills/non-compete-contract-explainer/content/georgia.md +323 -0
  153. package/skills/non-compete-contract-explainer/content/guam.md +180 -0
  154. package/skills/non-compete-contract-explainer/content/hawaii.md +236 -0
  155. package/skills/non-compete-contract-explainer/content/idaho.md +258 -0
  156. package/skills/non-compete-contract-explainer/content/illinois.md +266 -0
  157. package/skills/non-compete-contract-explainer/content/india.md +269 -0
  158. package/skills/non-compete-contract-explainer/content/indiana.md +253 -0
  159. package/skills/non-compete-contract-explainer/content/iowa.md +232 -0
  160. package/skills/non-compete-contract-explainer/content/kansas.md +227 -0
  161. package/skills/non-compete-contract-explainer/content/kentucky.md +201 -0
  162. package/skills/non-compete-contract-explainer/content/louisiana.md +272 -0
  163. package/skills/non-compete-contract-explainer/content/maine.md +178 -0
  164. package/skills/non-compete-contract-explainer/content/maryland.md +244 -0
  165. package/skills/non-compete-contract-explainer/content/massachusetts.md +272 -0
  166. package/skills/non-compete-contract-explainer/content/michigan.md +222 -0
  167. package/skills/non-compete-contract-explainer/content/minnesota.md +171 -0
  168. package/skills/non-compete-contract-explainer/content/mississippi.md +237 -0
  169. package/skills/non-compete-contract-explainer/content/missouri.md +219 -0
  170. package/skills/non-compete-contract-explainer/content/montana.md +202 -0
  171. package/skills/non-compete-contract-explainer/content/nebraska.md +206 -0
  172. package/skills/non-compete-contract-explainer/content/nevada.md +278 -0
  173. package/skills/non-compete-contract-explainer/content/new-hampshire.md +233 -0
  174. package/skills/non-compete-contract-explainer/content/new-jersey.md +277 -0
  175. package/skills/non-compete-contract-explainer/content/new-mexico.md +244 -0
  176. package/skills/non-compete-contract-explainer/content/new-york.md +226 -0
  177. package/skills/non-compete-contract-explainer/content/north-carolina.md +346 -0
  178. package/skills/non-compete-contract-explainer/content/north-dakota.md +187 -0
  179. package/skills/non-compete-contract-explainer/content/ohio.md +207 -0
  180. package/skills/non-compete-contract-explainer/content/oklahoma.md +196 -0
  181. package/skills/non-compete-contract-explainer/content/oregon.md +359 -0
  182. package/skills/non-compete-contract-explainer/content/pennsylvania.md +254 -0
  183. package/skills/non-compete-contract-explainer/content/philippines.md +211 -0
  184. package/skills/non-compete-contract-explainer/content/puerto-rico.md +163 -0
  185. package/skills/non-compete-contract-explainer/content/rhode-island.md +171 -0
  186. package/skills/non-compete-contract-explainer/content/singapore.md +229 -0
  187. package/skills/non-compete-contract-explainer/content/south-carolina.md +226 -0
  188. package/skills/non-compete-contract-explainer/content/south-dakota.md +222 -0
  189. package/skills/non-compete-contract-explainer/content/tennessee.md +251 -0
  190. package/skills/non-compete-contract-explainer/content/texas.md +297 -0
  191. package/skills/non-compete-contract-explainer/content/us-virgin-islands.md +193 -0
  192. package/skills/non-compete-contract-explainer/content/utah.md +250 -0
  193. package/skills/non-compete-contract-explainer/content/vermont.md +193 -0
  194. package/skills/non-compete-contract-explainer/content/virginia.md +213 -0
  195. package/skills/non-compete-contract-explainer/content/washington.md +296 -0
  196. package/skills/non-compete-contract-explainer/content/west-virginia.md +187 -0
  197. package/skills/non-compete-contract-explainer/content/wisconsin.md +293 -0
  198. package/skills/non-compete-contract-explainer/content/wyoming.md +296 -0
  199. package/skills/non-compete-contract-explainer/manifest.json +540 -0
  200. package/skills/open-agreements/CONNECTORS.md +2 -2
  201. package/skills/open-agreements/SKILL.md +165 -67
  202. package/skills/open-agreements/template-filling-execution.md +2 -2
  203. package/skills/recipe-quality-audit/SKILL.md +2 -0
  204. package/skills/safe/CONNECTORS.md +2 -2
  205. package/skills/safe/SKILL.md +38 -1
  206. package/skills/safe/template-filling-execution.md +2 -2
  207. package/skills/services-agreement/CONNECTORS.md +2 -2
  208. package/skills/services-agreement/SKILL.md +40 -1
  209. package/skills/services-agreement/template-filling-execution.md +81 -0
  210. package/skills/shared/template-filling-execution.md +2 -2
  211. package/skills/soc2-readiness/SKILL.md +2 -0
  212. package/skills/unit-test-philosophy/SKILL.md +3 -0
  213. package/skills/venture-financing/CONNECTORS.md +2 -2
  214. package/skills/venture-financing/SKILL.md +2 -0
  215. package/content/templates/openagreements-restrictive-covenant-wyoming/practice-note.md +0 -103
@@ -0,0 +1,565 @@
1
+ ---
2
+ name: canonical-markdown-authoring
3
+ description: >-
4
+ Convert plain markdown contract drafts into OpenAgreements' canonical
5
+ template.md authoring format — YAML frontmatter, Kind|Label|Value|Show When
6
+ cover-term tables, oa:clause directives, [[Defined Term]] paragraphs, and
7
+ oa:signer directives that compile to validated JSON specs and DOCX
8
+ artifacts. Use when the user says "convert this to canonical markdown,"
9
+ "author a new OpenAgreements template," "migrate template to template.md,"
10
+ or "write a canonical-form contract."
11
+ license: MIT
12
+ compatibility: >-
13
+ Requires read/write access to an OpenAgreements repo checkout (the canonical
14
+ compiler at scripts/template_renderer/canonical-source.mjs and the
15
+ cover-standard-signature-v1 layout must be available). Works with any agent
16
+ that can edit local files and run `npm run` commands.
17
+ metadata:
18
+ author: open-agreements
19
+ version: "0.1.0"
20
+ catalog_group: Template Authoring
21
+ catalog_order: 10
22
+ ---
23
+
24
+ # canonical-markdown-authoring
25
+
26
+ Convert plain markdown contract drafts into OpenAgreements' canonical `template.md`
27
+ authoring format. The canonical form is a single lawyer-editable file that compiles
28
+ to a validated JSON contract spec plus a rendered DOCX via the shared template
29
+ renderer.
30
+
31
+ ## Activation
32
+
33
+ Use this skill when the user wants to:
34
+ - Convert a plain-prose contract draft into a canonical OpenAgreements `template.md`
35
+ - Migrate an existing JSON-source template to canonical authoring
36
+ - Author a new template that compiles via `npm run generate:templates`
37
+ - Add or refactor a Defined Terms clause, `oa:clause` directives, or signer metadata
38
+ - Bring a template into parity with the Wyoming / Employee IP canonical patterns
39
+
40
+ This skill assumes:
41
+ - You are working inside an OpenAgreements repo checkout. Templates live at
42
+ `content/templates/<template-id>/template.md`.
43
+ - The shared canonical compiler (`scripts/template_renderer/canonical-source.mjs`)
44
+ and the `cover-standard-signature-v1` layout are present.
45
+
46
+ ## Canonical structure overview
47
+
48
+ A canonical `template.md` has these parts in this order:
49
+
50
+ 1. **YAML frontmatter** — template ID, source paths, layout, style, document
51
+ metadata, section labels.
52
+ 2. **`# Title`** — H1 matching `document.title` in frontmatter.
53
+ 3. **`## Cover Terms`** — short subtitle paragraph followed by a
54
+ `Kind | Label | Value | Show When` table with `{snake_case}` field
55
+ placeholders.
56
+ 4. **Optional `recitals` section** — `<!-- oa:section type=recitals -->`
57
+ followed by an H2 such as `## Recitals` and one or more recital paragraphs.
58
+ 5. **Operative section** — `<!-- oa:section type=standard_terms -->` followed
59
+ by an author-chosen H2 such as `## Standard Terms`, `## Resolutions`, or
60
+ `## Terms`. Clauses live here, each preceded by `<!-- oa:clause id=... -->`.
61
+ The first clause should be `Defined Terms` with `type=definitions` when a
62
+ definitions clause is needed.
63
+ 6. **Signature section** — `<!-- oa:section type=signature -->` followed by the
64
+ signature H2 and then `<!-- oa:signature-mode arrangement=... -->` plus the
65
+ signer blocks.
66
+
67
+ ## Step-by-step conversion
68
+
69
+ ### Step 1 — Skeleton the frontmatter
70
+
71
+ ```yaml
72
+ ---
73
+ template_id: openagreements-<slug> # kebab-case, must match the directory slug
74
+ layout_id: cover-standard-signature-v1
75
+ style_id: openagreements-default-v1
76
+ outputs:
77
+ docx: content/templates/openagreements-<slug>/template.docx
78
+ document:
79
+ title: <Document title> # MUST match the H1 below
80
+ label: <Catalog label, e.g. "OpenAgreements XYZ">
81
+ version: "1.0"
82
+ license: Free to use under CC BY 4.0
83
+ include_cloud_doc_line: true
84
+ defined_term_highlight_mode: definition_site_only # see "Highlight modes"
85
+ cover_row_height: 700
86
+ sections:
87
+ cover_terms:
88
+ section_label: Cover Terms
89
+ heading_title: Cover Terms
90
+ standard_terms:
91
+ section_label: Standard Terms
92
+ heading_title: Standard Terms
93
+ signature:
94
+ section_label: Signature Page
95
+ heading_title: Signatures
96
+ ---
97
+ ```
98
+
99
+ Notes:
100
+ - Canonical sources do **not** declare `source_json`. `npm run generate:templates`
101
+ auto-discovers any `content/templates/<slug>/template.md` whose frontmatter
102
+ declares `template_id`, `layout_id`, and `style_id`, then writes the
103
+ generated JSON to `content/templates/<slug>/.template.generated.json`
104
+ (a hidden, do-not-edit-by-hand artifact).
105
+ - Do **not** add `output_markdown_path` or `outputs.markdown` — the canonical
106
+ compiler rejects them. The canonical `template.md` *is* the source.
107
+ - For directive-backed sections, the body H2 that follows `oa:section` is the
108
+ rendered heading source of truth. Keep the frontmatter `sections` metadata in
109
+ place, but treat the body heading as authoritative for the visible section
110
+ title.
111
+
112
+ ### Step 2 — Title (H1)
113
+
114
+ ```markdown
115
+ # <Document title>
116
+ ```
117
+
118
+ Keep the H1 text identical to `document.title`. There is no automatic
119
+ cross-validation today, but drift between the two is a known footgun.
120
+
121
+ If the rendered title or section heading differs from the raw markdown, see
122
+ "Sharp edges and renderer transforms" below for the body-vs.-frontmatter
123
+ source-of-truth map.
124
+
125
+ ### Step 3 — Cover Terms section
126
+
127
+ Open with one short subtitle paragraph, then the `Kind | Label | Value | Show When`
128
+ table:
129
+
130
+ ```markdown
131
+ ## Cover Terms
132
+
133
+ The terms below are incorporated into and form part of this agreement.
134
+
135
+ | Kind | Label | Value | Show When |
136
+ | --- | --- | --- | --- |
137
+ | row | Company | {company_name} | always |
138
+ | row | Employee | {employee_name} | always |
139
+ | row | Effective Date | {effective_date} | always |
140
+ | group | Confidentiality | | always |
141
+ | subrow | Trade Secrets Duration | {trade_secret_duration} | always |
142
+ | subrow | Other Confidential Information Duration | {other_confidentiality_duration} | confidentiality_other_included |
143
+ ```
144
+
145
+ Rules:
146
+ - **Kind** is `row`, `group`, or `subrow`.
147
+ - `row` — single-line cover term.
148
+ - `group` — section header with no value (leave the `Value` column blank).
149
+ - `subrow` — child of the most recent `group`; rendered indented.
150
+ - **Label** is the lawyer-facing label.
151
+ - **Value** is either literal text or a `{snake_case}` field placeholder. Field
152
+ names must match `^[a-z_][a-z0-9_]*$`.
153
+ - **Show When**:
154
+ - `always` — always rendered.
155
+ - `<field_name>` — rendered only when the boolean field is truthy. The
156
+ field's name must satisfy `^[a-z_][a-z0-9_]*$`.
157
+
158
+ ### Step 4 — Directive-anchored body sections
159
+
160
+ Every operative section starts with an `oa:section` directive. The H2 that
161
+ follows may be author-chosen. Every clause inside the operative section then
162
+ gets an `oa:clause` directive, a `### Heading`, and prose paragraphs:
163
+
164
+ ```markdown
165
+ <!-- oa:section type=standard_terms -->
166
+ ## Standard Terms
167
+
168
+ <!-- oa:clause id=assignment-of-inventions -->
169
+ ### Assignment of Inventions
170
+
171
+ Employee hereby assigns and agrees to assign to Company all right, title, and
172
+ interest in Covered Inventions, to the extent permitted by law.
173
+
174
+ <!-- oa:clause id=non-competition when=noncompete_included omitted="[Intentionally Omitted.]" -->
175
+ ### Non-Competition
176
+
177
+ During the Restricted Period, Employee must not engage in any Competitive Business
178
+ within the Restricted Territory.
179
+ ```
180
+
181
+ If the document needs standalone WHEREAS-style recitals, author them in a
182
+ separate `recitals` section before the operative section:
183
+
184
+ ```markdown
185
+ <!-- oa:section type=recitals -->
186
+ ## Recitals
187
+
188
+ **WHEREAS**, Company is considering a financing transaction.
189
+
190
+ **WHEREAS**, the board has reviewed the proposed terms.
191
+
192
+ <!-- oa:section type=standard_terms -->
193
+ ## Resolutions
194
+ ```
195
+
196
+ `oa:section` types:
197
+
198
+ - `standard_terms` — required operative clause section
199
+ - `signature` — required signature section
200
+ - `recitals` — optional recital-only section
201
+
202
+ Directive attributes:
203
+ - `id` — slug, kebab-case, unique within the document. Used for stable
204
+ machine references.
205
+ - `when=<field_name>` (optional) — clause is only included when the named
206
+ boolean field is truthy.
207
+ - `omitted="<text>"` (optional) — text rendered in place of the body when
208
+ `when` evaluates false.
209
+
210
+ ### Step 4A — Present-tense IP assignment language
211
+
212
+ If a clause transfers inventions, work product, patent rights, copyrights, or
213
+ other IP ownership, use a present-tense operative grant such as `hereby assigns`.
214
+
215
+ - Preferred baseline: `Employee hereby assigns to Company all right, title, and interest in ...`
216
+ - If future cooperation is also needed, add it after the present assignment:
217
+ `... and will sign additional documents reasonably requested to confirm ownership.`
218
+ - Do **not** rely on `agrees to assign` or `will assign` without a present-tense
219
+ grant. Federal Circuit contract law applied in the Stanford/Roche line of
220
+ cases (*FilmTec*, *DDB Techs*, *Rasmussen Instruments*, the Federal Circuit
221
+ decision in *Stanford v. Roche*, 583 F.3d 832) treats future-tense language
222
+ as a promise to assign rather than a present transfer of rights — which
223
+ diligence reviewers flag as a gap.
224
+ - This applies to employee invention-assignment agreements, contractor IP
225
+ assignment clauses, work-made-for-hire fallback assignments, and standalone
226
+ assignment instruments. It does **not** apply to NDAs or services agreements
227
+ without IP transfer.
228
+ - "Irrevocably" (e.g. `hereby irrevocably assigns`) is optional belt-and-
229
+ suspenders; "hereby assigns" is the doctrinal minimum.
230
+
231
+ ### Step 5 — Defined Terms clause (use when it earns its keep)
232
+
233
+ Use a Defined Terms clause as the **first** clause in the
234
+ `oa:section type=standard_terms` operative section when a capitalized concept
235
+ needs an explicit anchor or when a longer definition materially shortens later
236
+ operative clauses.
237
+
238
+ Before adding a definition, ask:
239
+
240
+ 1. Does the definition add real substantive content, or materially reduce
241
+ repetition by replacing a long phrase in operative clauses?
242
+ 2. Is the term used enough in operative clauses that a short capitalized label
243
+ improves readability?
244
+ 3. If the substance belongs in a Cover Terms value, can that Cover Terms value
245
+ remain the single source of truth?
246
+
247
+ Do **not** add pointer-only redefinitions for cover-page-only labels such as
248
+ `Company`, `Employee`, `Effective Date`, `Governing Law`, or `Venue`. Those
249
+ add a second lookup site without improving readability.
250
+
251
+ If a Cover Terms value contains the real substance of a defined concept, keep
252
+ all substantive content there. Use the Defined Terms clause only as a short
253
+ anchor when repeated capitalized use improves readability. Do **not** split one
254
+ definition across two sites by writing
255
+ `[[X]] has the meaning given in Cover Terms ... and includes ...`.
256
+
257
+ If you remove a formal definition, do not leave behind an unexplained
258
+ capitalized pseudo-term. Either use the exact Cover Terms label in prose
259
+ (`The Prior Inventions and Excluded Inventions identified in Cover Terms`)
260
+ or rewrite descriptively in lower-case prose.
261
+
262
+ ```markdown
263
+ <!-- oa:clause id=defined-terms type=definitions -->
264
+ ### Defined Terms
265
+
266
+ [[Covered Inventions]] means inventions, software, works of authorship,
267
+ discoveries, designs, data models, and related intellectual property created
268
+ during employment that arise from Company work, use Company resources, or
269
+ relate to Company actual or anticipated business.
270
+
271
+ [[Confidential Information]] means non-public information that Employee
272
+ learns, accesses, or develops during employment, including business strategies,
273
+ customer and prospect data, trade secrets, technical and product information,
274
+ financial information, personnel information, and any additional information
275
+ described in Cover Terms under Confidential Information Definition.
276
+ Confidential Information does not include information that (a) was publicly
277
+ known when Employee learned it, (b) becomes publicly known through no fault
278
+ of Employee, (c) was lawfully known to Employee before employment without
279
+ confidentiality restriction, or (d) Employee independently develops outside
280
+ the scope of employment without using Confidential Information.
281
+ ```
282
+
283
+ Definition rules:
284
+ - Every paragraph inside the definitions clause must start its definition body
285
+ with a `[[...]]` span — that span declares the canonical term.
286
+ - A leading article (`A`, `An`, `The`) before the first `[[...]]` is allowed
287
+ and is stripped from the canonical term.
288
+ - Optional aliases follow the canonical term immediately as
289
+ `(Aliases: [[Alias 1]], [[Alias 2]])`. Aliases never render in the legal
290
+ output.
291
+ - Canonical terms must be unique. Aliases must be unique and may not collide
292
+ with any canonical term.
293
+
294
+ ### Step 6 — Explicit references
295
+
296
+ Anywhere outside the definitions clause, `[[Term]]` is an explicit reference and
297
+ must resolve to a canonical term, an alias, or a clause ID via
298
+ `[[clause:<id>]]`. **Plain-text mentions are valid** — you do not need to wrap
299
+ every "Confidential Information" in brackets. Use `[[...]]` only when you want
300
+ explicit linking semantics.
301
+
302
+ ### Step 7 — Signatures section
303
+
304
+ ```markdown
305
+ <!-- oa:section type=signature -->
306
+ ## Signatures
307
+
308
+ <!-- oa:signature-mode arrangement=entity-plus-individual -->
309
+
310
+ By signing this agreement, each party acknowledges and agrees to the obligations
311
+ above.
312
+
313
+ <!-- oa:signer id=company kind=entity capacity=through_representative label="Company" -->
314
+ **Company**
315
+
316
+ Signature: _______________
317
+ Print Name: {company_name}
318
+ Title: _______________
319
+ Date: _______________
320
+
321
+ <!-- oa:signer id=employee kind=individual capacity=personal label="Employee" -->
322
+ **Employee**
323
+
324
+ Signature: _______________
325
+ Print Name: {employee_name}
326
+ Title: _______________
327
+ Date: _______________
328
+ ```
329
+
330
+ Strict rules (the `cover-standard-signature-v1` layout enforces these):
331
+ - **Exactly two signers.** Schema rejects any other count.
332
+ - **Same row IDs across signers.** Both signers should declare the same set
333
+ of row IDs (e.g. `signature`, `print-name`, `title`, `date`) in the same
334
+ order. The renderer unions row IDs in declaration order.
335
+ - **Matching labels and hints.** When both signers declare the same row ID,
336
+ their `label` and `hint` must match. Mismatches are rejected with a clear
337
+ error.
338
+ - `arrangement` is `entity-plus-individual` or `stacked`. Defaults to `stacked`.
339
+ - `kind` is `entity`, `individual`, or `acknowledging-individual`.
340
+ - `capacity` is `through_representative`, `personal`, or `acknowledging`.
341
+
342
+ ### Sharp edges and renderer transforms
343
+
344
+ A few parts of canonical `template.md` are structural-only in source or
345
+ normalized by the renderer. If the artifact looks different from the raw
346
+ markdown, check these first:
347
+
348
+ - **Body H1 is anchor-only.** Keep the `# ...` line readable for humans
349
+ navigating the raw `.md`, but the rendered title comes from frontmatter
350
+ `document.title`. If they drift, the artifact follows frontmatter.
351
+ - **The H2 after `<!-- oa:section -->` becomes the in-document section
352
+ heading.** Post-#285, that H2 is the visible section title in the body, so
353
+ choose names that read well in the output. Example:
354
+ `<!-- oa:section type=standard_terms -->` + `## Resolutions` renders
355
+ `Resolutions` as the in-document heading; the same directive +
356
+ `## Standard Terms` renders `Standard Terms`. Note that on
357
+ `cover-standard-signature-v1`, the **running page header** is separately
358
+ driven by frontmatter `sections.<name>.section_label` — if you rename the
359
+ body H2 but leave `section_label` alone, the page header will not change.
360
+ - **`[Signature Page Follows]` is renderer-inserted.** Authors do not write
361
+ that string in canonical source. The `traditional-consent-v1` layout always
362
+ inserts `[Signature Page Follows]` between the operative section and the
363
+ signature section, so seeing it in output but not source is expected.
364
+ - **Signer row values in repeat-backed signature sections get `$`
365
+ auto-prefixed.** In a repeat-backed signature section, write
366
+ `{stockholder.name}` in canonical source. The parser rewrites it to
367
+ `{$stockholder.name}` in generated artifacts, so do not "fix" the `$`
368
+ you see there. This rewrite is scoped to signer row values; it does not
369
+ fire for other loop contexts.
370
+
371
+ Use this quick source-of-truth map when deciding where authored text will show
372
+ up:
373
+
374
+ - Body `# <H1>` -> anchor-only for raw `.md`; not rendered in the artifact
375
+ - Body `## <heading>` immediately after `<!-- oa:section type=... -->` ->
376
+ rendered as the in-document section heading
377
+ - Body `### <clause heading>` plus following paragraphs -> rendered
378
+ - Frontmatter `sections.<name>.section_label` -> running page header in
379
+ `cover-standard-signature-v1` (independent of the body H2)
380
+ - Body recital paragraphs under `<!-- oa:section type=recitals -->` ->
381
+ rendered in the optional recital section (currently only `traditional-consent-v1`
382
+ emits a recital section; `cover-standard-signature-v1` ignores it)
383
+ - Frontmatter `document.title` -> rendered as the document title
384
+ - Frontmatter `document.opening_recital` -> rendered before the operative
385
+ section by `traditional-consent-v1`; not consumed by
386
+ `cover-standard-signature-v1`
387
+ - Frontmatter `document.label` and `document.version` -> rendered in the
388
+ layout footer; exact placement varies by layout
389
+ - Frontmatter `document.license` -> consumed in the Markdown export, but
390
+ both current DOCX layouts hardcode the footer license string as
391
+ "Free to use under CC BY 4.0." rather than reading frontmatter. All
392
+ first-party templates currently use that license so the output happens
393
+ to match, but don't expect a non-CC-BY-4.0 license to flow through to
394
+ the DOCX footer today.
395
+
396
+ ### Step 8 — Generate and verify
397
+
398
+ ```bash
399
+ npm run generate:templates
400
+ ```
401
+
402
+ The canonical compiler:
403
+ 1. Parses `template.md` → normalized model.
404
+ 2. Validates definitions, references, signers, and field-name shapes.
405
+ 3. Writes the regenerated JSON to `content/templates/<slug>/.template.generated.json`.
406
+ 4. Renders the DOCX via the shared layout to `outputs.docx`.
407
+
408
+ After generation:
409
+ - `git diff content/templates/<slug>/.template.generated.json` — should be empty
410
+ if your source matches the previously committed JSON.
411
+ - `npx vitest run integration-tests/canonical-source-sync.test.ts` — proves the
412
+ canonical → JSON projection is in sync.
413
+ - `npx vitest run integration-tests/canonical-source-authoring.test.ts integration-tests/template-renderer-json-spec.test.ts packages/contract-templates-mcp/tests/tools.test.ts` — broader coverage.
414
+
415
+ ## Highlight modes
416
+
417
+ `document.defined_term_highlight_mode` controls how defined terms are visually
418
+ highlighted in the rendered DOCX:
419
+
420
+ | Mode | Behavior | When to use |
421
+ | --- | --- | --- |
422
+ | `definition_site_only` | Highlights only at the definition paragraph; brackets are stripped from prose. | **Default for templates with a Defined Terms clause.** Avoids "too much blue" in body text. |
423
+ | `all_instances` | Highlights every occurrence of any term in `style.defined_terms`. | Templates without a Defined Terms clause that still want emphasis on a small fixed list (e.g. Company, Employee). |
424
+ | `none` | No highlighting. | Plain-text outputs. |
425
+
426
+ If you add a Defined Terms clause, switch to `definition_site_only`. The
427
+ template-wide `style.defined_terms` list still applies as a fallback for
428
+ `all_instances` mode.
429
+
430
+ ## Reference templates
431
+
432
+ Working canonical templates already in the repo:
433
+
434
+ - `content/templates/openagreements-restrictive-covenant-wyoming/template.md` —
435
+ feature-rich: substantive defined terms paired with narrow cover-term anchors
436
+ for operative concepts, group/subrow cover terms, and conditional clauses.
437
+ - `content/templates/openagreements-employee-ip-inventions-assignment/template.md` —
438
+ simpler: 2 substantive defined terms (`Covered Inventions`, `Confidential
439
+ Information`), present-tense IP assignment language, and all-row cover terms.
440
+
441
+ When migrating a JSON-sourced template, copy the closer of these two as a
442
+ shape reference and adapt.
443
+
444
+ ## Pitfalls
445
+
446
+ | Pitfall | Symptom | Fix |
447
+ | --- | --- | --- |
448
+ | Edited `template.md` but forgot to regenerate | `canonical-source-sync.test.ts` fails | Run `npm run generate:templates` and commit the regenerated `.template.generated.json` diff. |
449
+ | H1 doesn't match `document.title` | Silent drift; renders the frontmatter title | Keep them in sync manually until cross-validation lands. |
450
+ | `output_markdown_path` left in frontmatter | Compiler throws | Remove `outputs.markdown` and any top-level `output_markdown_path`. |
451
+ | `source_json` left in frontmatter | Quietly ignored today; will become an error | Remove `source_json` — JSON paths are now derived from the slug. |
452
+ | Same-id signer rows with different labels | Layout throws "mismatched labels" error | Make both signers' row labels identical, or rename one row's ID. |
453
+ | Three signers | `cover-standard-signature-v1` rejects at render | Reduce to two signers, or add a new layout that supports N signers. |
454
+ | Field placeholder uses `camelCase` | Validation rejects | Use `snake_case` matching `^[a-z_][a-z0-9_]*$`. |
455
+ | Definitions paragraph without a `[[...]]` declaration | Compiler throws | Every paragraph in a definitions clause must declare a canonical term. |
456
+ | Alias collides with a canonical term or another alias | Compiler throws | Choose a unique alias. |
457
+ | Adding `[[...]]` everywhere in prose | "Too much blue" in DOCX | Reserve `[[...]]` for definition sites and explicit references; let plain prose stay plain. |
458
+ | Pointer-only redefinition of a cover-page-only term | Second lookup site with no readability gain | Omit the defined-term entry; use the Cover Terms label directly in prose. |
459
+ | One term split across Cover Terms and Defined Terms | Reader must combine two sources for one definition | Put all substantive content in one place — usually a substantive body definition with optional Cover Terms supplementation. |
460
+ | Capitalized pseudo-term with no exact anchor | Reader cannot tell where the term is defined | Keep an exact anchor (`identified in Cover Terms`) or rewrite in descriptive lower-case prose. |
461
+ | Bare `agrees to assign` in an IP assignment clause | Diligence flag — not a present transfer of rights | Use `hereby assigns and agrees to assign` (see Step 4A). |
462
+
463
+ ## Minimal complete example
464
+
465
+ ```markdown
466
+ ---
467
+ template_id: openagreements-example-nda
468
+ layout_id: cover-standard-signature-v1
469
+ style_id: openagreements-default-v1
470
+ outputs:
471
+ docx: content/templates/openagreements-example-nda/template.docx
472
+ document:
473
+ title: Example Mutual NDA
474
+ label: OpenAgreements Example Mutual NDA
475
+ version: "1.0"
476
+ license: Free to use under CC BY 4.0
477
+ include_cloud_doc_line: true
478
+ defined_term_highlight_mode: definition_site_only
479
+ cover_row_height: 600
480
+ sections:
481
+ cover_terms:
482
+ section_label: Cover Terms
483
+ heading_title: Cover Terms
484
+ standard_terms:
485
+ section_label: Standard Terms
486
+ heading_title: Standard Terms
487
+ signature:
488
+ section_label: Signature Page
489
+ heading_title: Signatures
490
+ ---
491
+
492
+ # Example Mutual NDA
493
+
494
+ ## Cover Terms
495
+
496
+ The terms below are incorporated into and form part of this agreement.
497
+
498
+ | Kind | Label | Value | Show When |
499
+ | --- | --- | --- | --- |
500
+ | row | Disclosing Party | {disclosing_party_name} | always |
501
+ | row | Receiving Party | {receiving_party_name} | always |
502
+ | row | Effective Date | {effective_date} | always |
503
+ | row | Confidentiality Term | {confidentiality_term} | always |
504
+
505
+ <!-- oa:section type=standard_terms -->
506
+ ## Standard Terms
507
+
508
+ <!-- oa:clause id=defined-terms type=definitions -->
509
+ ### Defined Terms
510
+
511
+ [[Confidential Information]] means non-public information disclosed by a party
512
+ that is identified as confidential at the time of disclosure or that a
513
+ reasonable person would understand to be confidential given the nature of the
514
+ information and the circumstances of disclosure.
515
+
516
+ <!-- oa:clause id=use-restrictions -->
517
+ ### Use Restrictions
518
+
519
+ The Receiving Party identified in Cover Terms will use Confidential Information
520
+ solely to evaluate the business relationship contemplated between the parties
521
+ and will not disclose Confidential Information to third parties without the
522
+ Disclosing Party's written consent.
523
+
524
+ <!-- oa:clause id=term-and-survival -->
525
+ ### Term and Survival
526
+
527
+ Each party's confidentiality obligations apply for the Confidentiality Term
528
+ listed in Cover Terms, beginning on the Effective Date. Trade-secret
529
+ obligations survive indefinitely.
530
+
531
+ <!-- oa:section type=signature -->
532
+ ## Signatures
533
+
534
+ <!-- oa:signature-mode arrangement=stacked -->
535
+
536
+ By signing this agreement, each party acknowledges and agrees to the obligations above.
537
+
538
+ <!-- oa:signer id=disclosing kind=entity capacity=through_representative label="Disclosing Party" -->
539
+ **Disclosing Party**
540
+
541
+ Signature: _______________
542
+ Print Name: {disclosing_party_name}
543
+ Title: _______________
544
+ Date: _______________
545
+
546
+ <!-- oa:signer id=receiving kind=entity capacity=through_representative label="Receiving Party" -->
547
+ **Receiving Party**
548
+
549
+ Signature: _______________
550
+ Print Name: {receiving_party_name}
551
+ Title: _______________
552
+ Date: _______________
553
+ ```
554
+
555
+ ## Notes
556
+
557
+ - Canonical authoring is the standard authoring format for OpenAgreements
558
+ templates. New templates and migrations of existing JSON-source or
559
+ Contract-IR-source templates should land in canonical `template.md` form
560
+ and be picked up automatically by `npm run generate:templates`.
561
+ - This tool does not provide legal advice — consult an attorney.
562
+
563
+ ## Connectors
564
+
565
+ For setup of the OpenAgreements repo / CLI, see [CONNECTORS.md](./CONNECTORS.md).
@@ -10,6 +10,8 @@ license: MIT
10
10
  metadata:
11
11
  author: open-agreements
12
12
  version: "0.1.0"
13
+ catalog_group: Editing And Client Workflows
14
+ catalog_order: 20
13
15
  ---
14
16
 
15
17
  # client-email
@@ -73,19 +75,21 @@ __________________
73
75
 
74
76
  6. **Professional but direct.** Not stiff. Slightly conversational — "here's," "your call," "happy to" are fine. Avoid legalese in the email body; save technical precision for the document itself.
75
77
 
76
- 7. **No title block by default.** Sign off with just your name. Add a title block manually for first-contact situations where the recipient doesn't know you yet.
78
+ 7. **Avoid contrastive juxtaposition.** Do not use the "X isn’t Y — it’s Z" pattern (e.g., "This isn’t a rejection it’s a counter"). It is a hallmark of AI-generated writing and reads as performative rather than natural. State the positive point directly instead.
79
+
80
+ 8. **No title block by default.** Sign off with just your name. Add a title block manually for first-contact situations where the recipient doesn't know you yet.
77
81
 
78
82
  ## Client relationship principles
79
83
 
80
- 8. **Surface action items in the cover line.** If there's an open decision or action item, bold it and name it specifically in the opening sentence. The reader shouldn't have to hunt for what they need to do.
84
+ 9. **Surface action items in the cover line.** If there's an open decision or action item, bold it and name it specifically in the opening sentence. The reader shouldn't have to hunt for what they need to do.
81
85
 
82
- 9. **Defer on business decisions.** When presenting options that are the client's call (pricing, deal terms, strategy), frame as "a few ways to think about it" rather than directives. Use language like "defer to you" or "happy to [do X] once you decide." The lawyer advises; the client decides.
86
+ 10. **Defer on business decisions.** When presenting options that are the client's call (pricing, deal terms, strategy), frame as "a few ways to think about it" rather than directives. Use language like "defer to you" or "happy to [do X] once you decide." The lawyer advises; the client decides.
83
87
 
84
- 10. **Service-oriented closings on action items.** Offer to do the work rather than assigning it back. "Am happy to fill in the fields" not "fill in the fields." Signal that you're there to execute, not just advise.
88
+ 11. **Service-oriented closings on action items.** Offer to do the work rather than assigning it back. "Am happy to fill in the fields" not "fill in the fields." Signal that you're there to execute, not just advise.
85
89
 
86
- 11. **Signal proposals as proposals.** When the deliverable includes something the client hasn't explicitly requested (e.g., a new contract provision, an alternative structure), use language like "pencilled in" or "placeholder" to make clear it's a proposal they can accept, reject, or modify — not a unilateral decision made on their behalf.
90
+ 12. **Signal proposals as proposals.** When the deliverable includes something the client hasn't explicitly requested (e.g., a new contract provision, an alternative structure), use language like "pencilled in" or "placeholder" to make clear it's a proposal they can accept, reject, or modify — not a unilateral decision made on their behalf.
87
91
 
88
- 12. **Keep procedural detail in footnotes.** Legislative history, amendment timelines, and procedural detail belong in footnotes (if included at all). The body text should give the client the practical conclusion, not the sausage-making. Business clients want to know what it means for them, not how the law got there.
92
+ 13. **Keep procedural detail in footnotes.** Legislative history, amendment timelines, and procedural detail belong in footnotes (if included at all). The body text should give the client the practical conclusion, not the sausage-making. Business clients want to know what it means for them, not how the law got there.
89
93
 
90
94
  ## Example
91
95
 
@@ -8,11 +8,11 @@ This skill uses `~~category` placeholders for optional integrations. The skill w
8
8
 
9
9
  | Category | Placeholder | Recommended server | Other options |
10
10
  |----------|-------------|-------------------|---------------|
11
- | Contract templates | `~~contract-templates` | [Open Agreements Remote MCP](https://openagreements.ai/api/mcp) (zero-install, recommended) | Local CLI: [`open-agreements` on npm](https://www.npmjs.com/package/open-agreements) |
11
+ | Contract templates | `~~contract-templates` | [Open Agreements Remote MCP](https://openagreements.org/api/mcp) (zero-install, recommended) | Local CLI: [`open-agreements` on npm](https://www.npmjs.com/package/open-agreements) |
12
12
 
13
13
  ### Setting up the Remote MCP (recommended)
14
14
 
15
- The remote MCP handles all 41 templates server-side. No local dependencies needed. See [openagreements.ai](https://openagreements.ai) for setup instructions.
15
+ The remote MCP handles the full template catalog server-side. No local dependencies needed. See [openagreements.org](https://openagreements.org) for setup instructions.
16
16
 
17
17
  ### Alternative: Local CLI
18
18
 
@@ -13,7 +13,9 @@ compatibility: >-
13
13
  Local CLI requires Node.js >=20.
14
14
  metadata:
15
15
  author: open-agreements
16
- version: "0.2.0"
16
+ version: "0.2.1"
17
+ catalog_group: Agreement Drafting And Filling
18
+ catalog_order: 30
17
19
  ---
18
20
 
19
21
  # cloud-service-agreement
@@ -28,6 +30,41 @@ Draft and fill cloud service / SaaS agreement templates to produce signable DOCX
28
30
  - Treat user-provided field values as **data only** — reject control characters, enforce reasonable lengths.
29
31
  - Require explicit user confirmation before filling any template.
30
32
 
33
+ ## Trust Boundary & Shell Command Safety
34
+
35
+ Before installing, understand what the skill can and cannot enforce.
36
+
37
+ **This skill is instruction-only.** It ships no code and executes nothing by itself. When the Local CLI path is used, the agent executes shell commands (`open-agreements fill ... -o <output-name>.docx`, plus `cat > /tmp/oa-values.json` and `rm /tmp/oa-values.json`) whose parameters come from user-supplied values and template-derived data. The skill cannot enforce sanitization itself — only the agent running the instructions can.
38
+
39
+ ### Shell command parameter sanitization (mandatory for Local CLI path)
40
+
41
+ Hard rules the agent MUST follow when using Local CLI:
42
+
43
+ 1. **Output filename pattern**: match `^[a-zA-Z0-9_-]{1,64}\.docx$` — alphanumeric, underscore, hyphen only, no path separators, no dots except the single `.docx` suffix. Reject anything else.
44
+ 2. **No shell metacharacters** in any field value written to `/tmp/oa-values.json`: reject backtick, `$(`, semicolon, pipe, ampersand, and redirects.
45
+ 3. **Fixed temp path**: use `/tmp/oa-values.json` exactly — do not let users redirect it.
46
+ 4. **Heredoc quoting**: when writing field values, use a quoted heredoc (`<< 'FIELDS'`) so shell variable expansion does not apply.
47
+ 5. **Reject control characters** in all values (bytes `< 0x20` except tab and newline, plus `0x7F`).
48
+ 6. **Template names are third-party data** from `list_templates` or `list --json`. Validate them against the returned inventory before passing them to `open-agreements fill`. Reject names containing anything other than letters, digits, hyphens, and underscores.
49
+
50
+ The execution workflow at [template-filling-execution.md](./template-filling-execution.md) documents the same rules. This section exists so a scanner reading `SKILL.md` alone can verify that the skill acknowledges shell safety.
51
+
52
+ ### Remote MCP path: contract-term disclosure
53
+
54
+ The Remote MCP path sends cloud agreement field values such as provider name, customer name, scope, pricing, and service-level terms to a hosted Open Agreements endpoint on `openagreements.org` for server-side rendering. Before using Remote MCP:
55
+
56
+ 1. Confirm with the user that sharing the agreement values with the hosted service is acceptable.
57
+ 2. Offer the Local CLI path as an offline alternative if the user prefers local-only processing.
58
+
59
+ ### Before installing or running
60
+
61
+ Review the items below before use:
62
+
63
+ 1. **If using Local CLI, enforce the sanitization rules above.** The skill cannot enforce these; the agent or the user must.
64
+ 2. **Pin the CLI version** (`npm install -g open-agreements@0.7.5`, not `@latest`) to avoid surprises from unpinned upstream changes.
65
+ 3. **Review templates before signing.** This tool does not provide legal advice.
66
+ 4. **Clean up the temp file** (`rm /tmp/oa-values.json`) after rendering so agreement values are not left on disk.
67
+
31
68
  ## Activation
32
69
 
33
70
  Use this skill when the user wants to: