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.
- package/LICENSE +21 -0
- package/README.md +161 -0
- package/bin/open-agreements.js +2 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +102 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/fill.d.ts +7 -0
- package/dist/commands/fill.d.ts.map +1 -0
- package/dist/commands/fill.js +84 -0
- package/dist/commands/fill.js.map +1 -0
- package/dist/commands/list.d.ts +6 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +202 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/recipe.d.ts +21 -0
- package/dist/commands/recipe.d.ts.map +1 -0
- package/dist/commands/recipe.js +71 -0
- package/dist/commands/recipe.js.map +1 -0
- package/dist/commands/scan.d.ts +12 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +122 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/validate.d.ts +6 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +139 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/core/command-generation/adapters/claude.d.ts +11 -0
- package/dist/core/command-generation/adapters/claude.d.ts.map +1 -0
- package/dist/core/command-generation/adapters/claude.js +85 -0
- package/dist/core/command-generation/adapters/claude.js.map +1 -0
- package/dist/core/command-generation/types.d.ts +14 -0
- package/dist/core/command-generation/types.d.ts.map +1 -0
- package/dist/core/command-generation/types.js +2 -0
- package/dist/core/command-generation/types.js.map +1 -0
- package/dist/core/engine.d.ts +13 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +149 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/external/index.d.ts +8 -0
- package/dist/core/external/index.d.ts.map +1 -0
- package/dist/core/external/index.js +92 -0
- package/dist/core/external/index.js.map +1 -0
- package/dist/core/external/types.d.ts +18 -0
- package/dist/core/external/types.d.ts.map +1 -0
- package/dist/core/external/types.js +2 -0
- package/dist/core/external/types.js.map +1 -0
- package/dist/core/fill-pipeline.d.ts +61 -0
- package/dist/core/fill-pipeline.d.ts.map +1 -0
- package/dist/core/fill-pipeline.js +279 -0
- package/dist/core/fill-pipeline.js.map +1 -0
- package/dist/core/fill-utils.d.ts +39 -0
- package/dist/core/fill-utils.d.ts.map +1 -0
- package/dist/core/fill-utils.js +127 -0
- package/dist/core/fill-utils.js.map +1 -0
- package/dist/core/metadata.d.ts +396 -0
- package/dist/core/metadata.d.ts.map +1 -0
- package/dist/core/metadata.js +126 -0
- package/dist/core/metadata.js.map +1 -0
- package/dist/core/recipe/cleaner.d.ts +13 -0
- package/dist/core/recipe/cleaner.d.ts.map +1 -0
- package/dist/core/recipe/cleaner.js +106 -0
- package/dist/core/recipe/cleaner.js.map +1 -0
- package/dist/core/recipe/downloader.d.ts +8 -0
- package/dist/core/recipe/downloader.d.ts.map +1 -0
- package/dist/core/recipe/downloader.js +58 -0
- package/dist/core/recipe/downloader.js.map +1 -0
- package/dist/core/recipe/index.d.ts +14 -0
- package/dist/core/recipe/index.d.ts.map +1 -0
- package/dist/core/recipe/index.js +91 -0
- package/dist/core/recipe/index.js.map +1 -0
- package/dist/core/recipe/ooxml-parts.d.ts +21 -0
- package/dist/core/recipe/ooxml-parts.d.ts.map +1 -0
- package/dist/core/recipe/ooxml-parts.js +33 -0
- package/dist/core/recipe/ooxml-parts.js.map +1 -0
- package/dist/core/recipe/patcher.d.ts +17 -0
- package/dist/core/recipe/patcher.d.ts.map +1 -0
- package/dist/core/recipe/patcher.js +240 -0
- package/dist/core/recipe/patcher.js.map +1 -0
- package/dist/core/recipe/types.d.ts +28 -0
- package/dist/core/recipe/types.d.ts.map +1 -0
- package/dist/core/recipe/types.js +2 -0
- package/dist/core/recipe/types.js.map +1 -0
- package/dist/core/recipe/verifier.d.ts +24 -0
- package/dist/core/recipe/verifier.d.ts.map +1 -0
- package/dist/core/recipe/verifier.js +143 -0
- package/dist/core/recipe/verifier.js.map +1 -0
- package/dist/core/validation/external.d.ts +16 -0
- package/dist/core/validation/external.d.ts.map +1 -0
- package/dist/core/validation/external.js +106 -0
- package/dist/core/validation/external.js.map +1 -0
- package/dist/core/validation/license.d.ts +15 -0
- package/dist/core/validation/license.d.ts.map +1 -0
- package/dist/core/validation/license.js +30 -0
- package/dist/core/validation/license.js.map +1 -0
- package/dist/core/validation/output.d.ts +12 -0
- package/dist/core/validation/output.d.ts.map +1 -0
- package/dist/core/validation/output.js +47 -0
- package/dist/core/validation/output.js.map +1 -0
- package/dist/core/validation/recipe.d.ts +19 -0
- package/dist/core/validation/recipe.d.ts.map +1 -0
- package/dist/core/validation/recipe.js +148 -0
- package/dist/core/validation/recipe.js.map +1 -0
- package/dist/core/validation/template.d.ts +11 -0
- package/dist/core/validation/template.d.ts.map +1 -0
- package/dist/core/validation/template.js +159 -0
- package/dist/core/validation/template.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/paths.d.ts +15 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +43 -0
- package/dist/utils/paths.js.map +1 -0
- package/external/LICENSE +27 -0
- package/external/README.md +38 -0
- package/external/yc-safe-discount/README.md +16 -0
- package/external/yc-safe-discount/clean.json +4 -0
- package/external/yc-safe-discount/metadata.yaml +71 -0
- package/external/yc-safe-discount/replacements.json +13 -0
- package/external/yc-safe-discount/template.docx +0 -0
- package/external/yc-safe-mfn/README.md +16 -0
- package/external/yc-safe-mfn/clean.json +4 -0
- package/external/yc-safe-mfn/metadata.yaml +64 -0
- package/external/yc-safe-mfn/replacements.json +12 -0
- package/external/yc-safe-mfn/template.docx +0 -0
- package/external/yc-safe-pro-rata-side-letter/README.md +16 -0
- package/external/yc-safe-pro-rata-side-letter/clean.json +4 -0
- package/external/yc-safe-pro-rata-side-letter/metadata.yaml +49 -0
- package/external/yc-safe-pro-rata-side-letter/replacements.json +9 -0
- package/external/yc-safe-pro-rata-side-letter/template.docx +0 -0
- package/external/yc-safe-valuation-cap/README.md +16 -0
- package/external/yc-safe-valuation-cap/clean.json +4 -0
- package/external/yc-safe-valuation-cap/metadata.yaml +64 -0
- package/external/yc-safe-valuation-cap/replacements.json +12 -0
- package/external/yc-safe-valuation-cap/template.docx +0 -0
- package/package.json +77 -0
- package/recipes/nvca-certificate-of-incorporation/clean.json +8 -0
- package/recipes/nvca-certificate-of-incorporation/metadata.yaml +43 -0
- package/recipes/nvca-certificate-of-incorporation/replacements.json +9 -0
- package/recipes/nvca-certificate-of-incorporation/schema.json +11 -0
- package/recipes/nvca-indemnification-agreement/clean.json +7 -0
- package/recipes/nvca-indemnification-agreement/metadata.yaml +83 -0
- package/recipes/nvca-indemnification-agreement/replacements.json +17 -0
- package/recipes/nvca-indemnification-agreement/schema.json +19 -0
- package/recipes/nvca-investors-rights-agreement/clean.json +12 -0
- package/recipes/nvca-investors-rights-agreement/metadata.yaml +75 -0
- package/recipes/nvca-investors-rights-agreement/replacements.json +18 -0
- package/recipes/nvca-investors-rights-agreement/schema.json +18 -0
- package/recipes/nvca-management-rights-letter/clean.json +7 -0
- package/recipes/nvca-management-rights-letter/metadata.yaml +50 -0
- package/recipes/nvca-management-rights-letter/replacements.json +11 -0
- package/recipes/nvca-management-rights-letter/schema.json +13 -0
- package/recipes/nvca-rofr-co-sale-agreement/clean.json +7 -0
- package/recipes/nvca-rofr-co-sale-agreement/metadata.yaml +80 -0
- package/recipes/nvca-rofr-co-sale-agreement/replacements.json +17 -0
- package/recipes/nvca-rofr-co-sale-agreement/schema.json +19 -0
- package/recipes/nvca-stock-purchase-agreement/clean.json +10 -0
- package/recipes/nvca-stock-purchase-agreement/metadata.yaml +74 -0
- package/recipes/nvca-stock-purchase-agreement/replacements.json +20 -0
- package/recipes/nvca-stock-purchase-agreement/schema.json +19 -0
- package/recipes/nvca-voting-agreement/README.md +53 -0
- package/recipes/nvca-voting-agreement/clean.json +7 -0
- package/recipes/nvca-voting-agreement/metadata.yaml +70 -0
- package/recipes/nvca-voting-agreement/replacements.json +18 -0
- package/recipes/nvca-voting-agreement/schema.json +28 -0
- package/skills/open-agreements/SKILL.md +166 -0
- package/templates/bonterms-mutual-nda/README.md +27 -0
- package/templates/bonterms-mutual-nda/metadata.yaml +58 -0
- package/templates/bonterms-mutual-nda/template.docx +0 -0
- package/templates/bonterms-professional-services-agreement/README.md +24 -0
- package/templates/bonterms-professional-services-agreement/metadata.yaml +40 -0
- package/templates/bonterms-professional-services-agreement/template.docx +0 -0
- package/templates/common-paper-ai-addendum/README.md +23 -0
- package/templates/common-paper-ai-addendum/metadata.yaml +33 -0
- package/templates/common-paper-ai-addendum/template.docx +0 -0
- package/templates/common-paper-ai-addendum-in-app/README.md +21 -0
- package/templates/common-paper-ai-addendum-in-app/metadata.yaml +23 -0
- package/templates/common-paper-ai-addendum-in-app/template.docx +0 -0
- package/templates/common-paper-amendment/README.md +27 -0
- package/templates/common-paper-amendment/metadata.yaml +53 -0
- package/templates/common-paper-amendment/template.docx +0 -0
- package/templates/common-paper-business-associate-agreement/README.md +29 -0
- package/templates/common-paper-business-associate-agreement/metadata.yaml +63 -0
- package/templates/common-paper-business-associate-agreement/template.docx +0 -0
- package/templates/common-paper-cloud-service-agreement/README.md +32 -0
- package/templates/common-paper-cloud-service-agreement/metadata.yaml +488 -0
- package/templates/common-paper-cloud-service-agreement/template.docx +0 -0
- package/templates/common-paper-csa-click-through/README.md +33 -0
- package/templates/common-paper-csa-click-through/metadata.yaml +83 -0
- package/templates/common-paper-csa-click-through/template.docx +0 -0
- package/templates/common-paper-csa-with-ai/README.md +49 -0
- package/templates/common-paper-csa-with-ai/metadata.yaml +166 -0
- package/templates/common-paper-csa-with-ai/template.docx +0 -0
- package/templates/common-paper-csa-with-sla/README.md +53 -0
- package/templates/common-paper-csa-with-sla/metadata.yaml +185 -0
- package/templates/common-paper-csa-with-sla/template.docx +0 -0
- package/templates/common-paper-csa-without-sla/README.md +47 -0
- package/templates/common-paper-csa-without-sla/metadata.yaml +155 -0
- package/templates/common-paper-csa-without-sla/template.docx +0 -0
- package/templates/common-paper-data-processing-agreement/README.md +46 -0
- package/templates/common-paper-data-processing-agreement/metadata.yaml +149 -0
- package/templates/common-paper-data-processing-agreement/template.docx +0 -0
- package/templates/common-paper-design-partner-agreement/README.md +29 -0
- package/templates/common-paper-design-partner-agreement/metadata.yaml +65 -0
- package/templates/common-paper-design-partner-agreement/template.docx +0 -0
- package/templates/common-paper-independent-contractor-agreement/README.md +27 -0
- package/templates/common-paper-independent-contractor-agreement/metadata.yaml +55 -0
- package/templates/common-paper-independent-contractor-agreement/template.docx +0 -0
- package/templates/common-paper-letter-of-intent/README.md +25 -0
- package/templates/common-paper-letter-of-intent/metadata.yaml +43 -0
- package/templates/common-paper-letter-of-intent/template.docx +0 -0
- package/templates/common-paper-mutual-nda/README.md +29 -0
- package/templates/common-paper-mutual-nda/metadata.yaml +59 -0
- package/templates/common-paper-mutual-nda/template.docx +0 -0
- package/templates/common-paper-one-way-nda/README.md +27 -0
- package/templates/common-paper-one-way-nda/metadata.yaml +60 -0
- package/templates/common-paper-one-way-nda/template.docx +0 -0
- package/templates/common-paper-order-form/README.md +36 -0
- package/templates/common-paper-order-form/metadata.yaml +98 -0
- package/templates/common-paper-order-form/template.docx +0 -0
- package/templates/common-paper-order-form-with-sla/README.md +42 -0
- package/templates/common-paper-order-form-with-sla/metadata.yaml +129 -0
- package/templates/common-paper-order-form-with-sla/template.docx +0 -0
- package/templates/common-paper-partnership-agreement/README.md +34 -0
- package/templates/common-paper-partnership-agreement/metadata.yaml +90 -0
- package/templates/common-paper-partnership-agreement/template.docx +0 -0
- package/templates/common-paper-pilot-agreement/README.md +34 -0
- package/templates/common-paper-pilot-agreement/metadata.yaml +90 -0
- package/templates/common-paper-pilot-agreement/template.docx +0 -0
- package/templates/common-paper-professional-services-agreement/README.md +44 -0
- package/templates/common-paper-professional-services-agreement/metadata.yaml +141 -0
- package/templates/common-paper-professional-services-agreement/template.docx +0 -0
- package/templates/common-paper-software-license-agreement/README.md +18 -0
- package/templates/common-paper-software-license-agreement/metadata.yaml +13 -0
- package/templates/common-paper-software-license-agreement/template.docx +0 -0
- package/templates/common-paper-statement-of-work/README.md +32 -0
- package/templates/common-paper-statement-of-work/metadata.yaml +78 -0
- package/templates/common-paper-statement-of-work/template.docx +0 -0
- package/templates/common-paper-term-sheet/README.md +22 -0
- package/templates/common-paper-term-sheet/metadata.yaml +28 -0
- package/templates/common-paper-term-sheet/template.docx +0 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 UseJunior
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# OpenAgreements
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/open-agreements)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://skills.sh)
|
|
6
|
+
|
|
7
|
+
Fill standard legal agreement templates and produce signable DOCX files. 25 templates covering NDAs, cloud terms, contractor agreements, SAFEs, and NVCA financing documents.
|
|
8
|
+
|
|
9
|
+
## Use with Claude Code
|
|
10
|
+
|
|
11
|
+
OpenAgreements works as a [Claude Code plugin](https://docs.anthropic.com/en/docs/claude-code/plugins) and [Agent Skill](https://agentskills.io). No pre-installation required — Claude downloads and runs the CLI on demand via `npx`.
|
|
12
|
+
|
|
13
|
+
### Option 1: Agent Skill (recommended)
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npx skills add open-agreements/open-agreements
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Then ask Claude to draft an agreement:
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
> Draft an NDA between Acme Corp and Beta Inc
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Claude discovers available templates, interviews you for field values, and renders a signed-ready DOCX.
|
|
26
|
+
|
|
27
|
+
### Option 2: Direct with Claude Code
|
|
28
|
+
|
|
29
|
+
If you have Node.js >= 20, just ask Claude:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
> Fill the Common Paper mutual NDA for my company
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Claude runs `npx -y open-agreements@latest list --json` to discover templates, then `npx -y open-agreements@latest fill <template>` to render the output. Zero install.
|
|
36
|
+
|
|
37
|
+
### Option 3: CLI
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Install globally
|
|
41
|
+
npm install -g open-agreements
|
|
42
|
+
|
|
43
|
+
# List available templates
|
|
44
|
+
open-agreements list
|
|
45
|
+
|
|
46
|
+
# Fill a template
|
|
47
|
+
open-agreements fill common-paper-mutual-nda -d values.json -o my-nda.docx
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### What Happens
|
|
51
|
+
|
|
52
|
+
1. Claude runs `list --json` to discover 25 templates and their fields
|
|
53
|
+
2. Claude interviews you for field values (grouped by section, up to 4 questions per round)
|
|
54
|
+
3. Claude runs `fill <template>` to render a DOCX preserving all original formatting
|
|
55
|
+
4. You review and sign the output document
|
|
56
|
+
|
|
57
|
+
## Templates
|
|
58
|
+
|
|
59
|
+
25 templates across three tiers. Run `open-agreements list` for the full inventory.
|
|
60
|
+
|
|
61
|
+
| Tier | Count | Source | How It Works |
|
|
62
|
+
|------|-------|--------|--------------|
|
|
63
|
+
| Internal templates | 14 | [Common Paper](https://commonpaper.com), [Bonterms](https://bonterms.com) | Shipped in package, CC BY 4.0 |
|
|
64
|
+
| External templates | 4 | [Y Combinator](https://www.ycombinator.com/documents) | Vendored unchanged, CC BY-ND 4.0 |
|
|
65
|
+
| Recipes | 7 | [NVCA](https://nvca.org/model-legal-documents/) | Downloaded on demand (not redistributable) |
|
|
66
|
+
|
|
67
|
+
**Internal templates** (NDAs, cloud terms, contractor agreements, etc.) are CC BY 4.0 — we ship the DOCX with `{tag}` placeholders.
|
|
68
|
+
|
|
69
|
+
**External templates** (YC SAFEs) are CC BY-ND 4.0 — we vendor the original unchanged. The filled output is a transient derivative on your machine.
|
|
70
|
+
|
|
71
|
+
**Recipes** (NVCA financing documents) are freely downloadable but not redistributable — we ship only transformation instructions and download the source DOCX from nvca.org at runtime.
|
|
72
|
+
|
|
73
|
+
Each template is a self-contained directory:
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
templates/<name>/
|
|
77
|
+
├── template.docx # DOCX with {tag} placeholders
|
|
78
|
+
├── metadata.yaml # Fields, license, source, attribution
|
|
79
|
+
└── README.md # Template-specific documentation
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## CLI Commands
|
|
83
|
+
|
|
84
|
+
### `fill <template>`
|
|
85
|
+
|
|
86
|
+
Render a filled DOCX from a template.
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# Using a JSON data file
|
|
90
|
+
open-agreements fill common-paper-mutual-nda -d data.json -o output.docx
|
|
91
|
+
|
|
92
|
+
# Using inline --set flags
|
|
93
|
+
open-agreements fill common-paper-mutual-nda --set party_1_name="Acme Corp" --set governing_law="Delaware"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### `validate [template]`
|
|
97
|
+
|
|
98
|
+
Run the validation pipeline on one or all templates.
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
open-agreements validate # All templates
|
|
102
|
+
open-agreements validate common-paper-mutual-nda # One template
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### `list`
|
|
106
|
+
|
|
107
|
+
Show available templates with license info and field counts.
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
open-agreements list
|
|
111
|
+
|
|
112
|
+
# Machine-readable JSON output (for agent skills and automation)
|
|
113
|
+
open-agreements list --json
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Contributing
|
|
117
|
+
|
|
118
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for how to add templates, recipes, and other improvements.
|
|
119
|
+
|
|
120
|
+
- [Adding templates](docs/adding-templates.md) (CC BY 4.0 / CC0 sources)
|
|
121
|
+
- [Adding recipes](docs/adding-recipes.md) (non-redistributable sources)
|
|
122
|
+
|
|
123
|
+
## Architecture
|
|
124
|
+
|
|
125
|
+
- **Language**: TypeScript
|
|
126
|
+
- **DOCX Engine**: [docx-templates](https://www.npmjs.com/package/docx-templates) (MIT)
|
|
127
|
+
- **CLI**: [Commander.js](https://www.npmjs.com/package/commander)
|
|
128
|
+
- **Validation**: [Zod](https://www.npmjs.com/package/zod) schemas
|
|
129
|
+
- **Skill Pattern**: Agent-agnostic `ToolCommandAdapter` interface
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
src/
|
|
133
|
+
├── cli/ # Commander.js CLI
|
|
134
|
+
├── commands/ # fill, validate, list, recipe, scan
|
|
135
|
+
├── core/
|
|
136
|
+
│ ├── engine.ts # docx-templates wrapper
|
|
137
|
+
│ ├── metadata.ts # Zod schemas + loader
|
|
138
|
+
│ ├── recipe/ # Recipe pipeline (clean → patch → fill → verify)
|
|
139
|
+
│ ├── external/ # External template support
|
|
140
|
+
│ ├── validation/ # template, license, output, recipe
|
|
141
|
+
│ └── command-generation/
|
|
142
|
+
│ ├── types.ts # ToolCommandAdapter interface
|
|
143
|
+
│ └── adapters/ # Claude Code adapter
|
|
144
|
+
└── index.ts # Public API
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Resources
|
|
148
|
+
|
|
149
|
+
- [Claude Code Documentation](https://docs.anthropic.com/en/docs/claude-code)
|
|
150
|
+
- [Claude Code Plugins Guide](https://docs.anthropic.com/en/docs/claude-code/plugins)
|
|
151
|
+
- [Agent Skills Specification](https://agentskills.io)
|
|
152
|
+
|
|
153
|
+
## License
|
|
154
|
+
|
|
155
|
+
MIT
|
|
156
|
+
|
|
157
|
+
Template content is licensed by their respective authors — CC BY 4.0 (Common Paper, Bonterms), CC BY-ND 4.0 (Y Combinator), or proprietary (NVCA, downloaded at runtime). See each template's `metadata.yaml` for details.
|
|
158
|
+
|
|
159
|
+
## Disclaimer
|
|
160
|
+
|
|
161
|
+
This tool generates documents from standard templates. It does not provide legal advice. No affiliation with or endorsement by Common Paper, Bonterms, Y Combinator, NVCA, or any template source is implied. Consult an attorney for legal guidance.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { join, dirname } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { runFill } from '../commands/fill.js';
|
|
6
|
+
import { runValidate } from '../commands/validate.js';
|
|
7
|
+
import { runList } from '../commands/list.js';
|
|
8
|
+
import { runRecipeCommand, runRecipeClean, runRecipePatch } from '../commands/recipe.js';
|
|
9
|
+
import { runScan } from '../commands/scan.js';
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = dirname(__filename);
|
|
12
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, '..', '..', 'package.json'), 'utf-8'));
|
|
13
|
+
const program = new Command();
|
|
14
|
+
program
|
|
15
|
+
.name('open-agreements')
|
|
16
|
+
.description('Open-source legal template and recipe filling CLI')
|
|
17
|
+
.version(pkg.version);
|
|
18
|
+
// --- Fill command ---
|
|
19
|
+
const fillCmd = new Command('fill');
|
|
20
|
+
fillCmd
|
|
21
|
+
.description('Fill a template with provided values and render a DOCX file')
|
|
22
|
+
.argument('<template>', 'Template name to fill')
|
|
23
|
+
.option('-o, --output <path>', 'Output file path')
|
|
24
|
+
.option('-d, --data <json-file>', 'JSON file with field values')
|
|
25
|
+
.option('--set <key=value...>', 'Set a field value (repeatable)')
|
|
26
|
+
.action(async (template, opts) => {
|
|
27
|
+
let values = {};
|
|
28
|
+
if (opts.data) {
|
|
29
|
+
values = JSON.parse(readFileSync(opts.data, 'utf-8'));
|
|
30
|
+
}
|
|
31
|
+
for (const pair of opts.set ?? []) {
|
|
32
|
+
const eq = pair.indexOf('=');
|
|
33
|
+
if (eq < 1)
|
|
34
|
+
throw new Error(`Invalid --set format: "${pair}" (expected key=value)`);
|
|
35
|
+
values[pair.slice(0, eq)] = pair.slice(eq + 1);
|
|
36
|
+
}
|
|
37
|
+
await runFill({ template, output: opts.output, values });
|
|
38
|
+
});
|
|
39
|
+
program.addCommand(fillCmd);
|
|
40
|
+
// --- Validate command ---
|
|
41
|
+
program
|
|
42
|
+
.command('validate [template]')
|
|
43
|
+
.description('Run validation pipeline on all templates and recipes')
|
|
44
|
+
.option('--strict', 'Treat warnings (scaffolds, missing files) as errors')
|
|
45
|
+
.action((template, opts) => {
|
|
46
|
+
runValidate({ template, strict: opts.strict });
|
|
47
|
+
});
|
|
48
|
+
// --- List command ---
|
|
49
|
+
program
|
|
50
|
+
.command('list')
|
|
51
|
+
.description('Show all available agreements (templates, external, and recipes)')
|
|
52
|
+
.option('--json', 'Output machine-readable JSON with full field definitions')
|
|
53
|
+
.option('--json-strict', 'Like --json but exit non-zero if any metadata fails')
|
|
54
|
+
.action((opts) => {
|
|
55
|
+
runList({ json: opts.json, jsonStrict: opts.jsonStrict });
|
|
56
|
+
});
|
|
57
|
+
// --- Recipe command ---
|
|
58
|
+
const recipeCmd = new Command('recipe');
|
|
59
|
+
recipeCmd.description('Work with recipe-based document pipelines');
|
|
60
|
+
recipeCmd
|
|
61
|
+
.command('run <recipe-id>')
|
|
62
|
+
.description('Run the full recipe pipeline (clean → patch → fill → verify)')
|
|
63
|
+
.option('-i, --input <path>', 'Source DOCX file (auto-downloads if omitted)')
|
|
64
|
+
.option('-o, --output <path>', 'Output file path')
|
|
65
|
+
.option('-d, --data <json-file>', 'JSON file with field values')
|
|
66
|
+
.option('--keep-intermediate', 'Preserve intermediate files')
|
|
67
|
+
.action(async (recipeId, opts) => {
|
|
68
|
+
await runRecipeCommand({
|
|
69
|
+
recipeId,
|
|
70
|
+
input: opts.input,
|
|
71
|
+
output: opts.output,
|
|
72
|
+
data: opts.data,
|
|
73
|
+
keepIntermediate: opts.keepIntermediate,
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
recipeCmd
|
|
77
|
+
.command('clean <input>')
|
|
78
|
+
.description('Run only the clean stage of a recipe')
|
|
79
|
+
.requiredOption('-o, --output <path>', 'Output file path')
|
|
80
|
+
.requiredOption('--recipe <id>', 'Recipe ID to use for clean config')
|
|
81
|
+
.action(async (input, opts) => {
|
|
82
|
+
await runRecipeClean({ input, output: opts.output, recipe: opts.recipe });
|
|
83
|
+
});
|
|
84
|
+
recipeCmd
|
|
85
|
+
.command('patch <input>')
|
|
86
|
+
.description('Run only the patch stage of a recipe')
|
|
87
|
+
.requiredOption('-o, --output <path>', 'Output file path')
|
|
88
|
+
.requiredOption('--recipe <id>', 'Recipe ID to use for replacements')
|
|
89
|
+
.action(async (input, opts) => {
|
|
90
|
+
await runRecipePatch({ input, output: opts.output, recipe: opts.recipe });
|
|
91
|
+
});
|
|
92
|
+
program.addCommand(recipeCmd);
|
|
93
|
+
// --- Scan command ---
|
|
94
|
+
program
|
|
95
|
+
.command('scan <input>')
|
|
96
|
+
.description('Scan a DOCX file for bracketed placeholders')
|
|
97
|
+
.option('--output-replacements <path>', 'Write a draft replacements.json')
|
|
98
|
+
.action((input, opts) => {
|
|
99
|
+
runScan({ input, outputReplacements: opts.outputReplacements });
|
|
100
|
+
});
|
|
101
|
+
program.parse();
|
|
102
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fill.d.ts","sourceRoot":"","sources":["../../src/commands/fill.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAuD3D"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
3
|
+
import { fillTemplate } from '../core/engine.js';
|
|
4
|
+
import { getTemplatesDir, resolveTemplateDir, getExternalDir, resolveExternalDir, getRecipesDir, resolveRecipeDir } from '../utils/paths.js';
|
|
5
|
+
import { runExternalFill } from '../core/external/index.js';
|
|
6
|
+
import { runRecipe } from '../core/recipe/index.js';
|
|
7
|
+
export async function runFill(args) {
|
|
8
|
+
// Search templates/ → external/ → recipes/
|
|
9
|
+
const templateDir = resolveTemplateDir(args.template);
|
|
10
|
+
const externalDir = resolveExternalDir(args.template);
|
|
11
|
+
const recipeDir = resolveRecipeDir(args.template);
|
|
12
|
+
const isTemplate = existsSync(templateDir);
|
|
13
|
+
const isExternal = !isTemplate && existsSync(externalDir);
|
|
14
|
+
const isRecipe = !isTemplate && !isExternal && existsSync(recipeDir);
|
|
15
|
+
if (!isTemplate && !isExternal && !isRecipe) {
|
|
16
|
+
const available = getAvailableIds();
|
|
17
|
+
console.error(`Agreement "${args.template}" not found in templates, external, or recipes.`);
|
|
18
|
+
if (available.length > 0) {
|
|
19
|
+
console.error(`Available: ${available.join(', ')}`);
|
|
20
|
+
}
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
const outputPath = args.output ?? `${args.template}-filled.docx`;
|
|
24
|
+
const resolvedOutput = resolve(outputPath);
|
|
25
|
+
try {
|
|
26
|
+
if (isRecipe) {
|
|
27
|
+
const result = await runRecipe({
|
|
28
|
+
recipeId: args.template,
|
|
29
|
+
outputPath: resolvedOutput,
|
|
30
|
+
values: args.values,
|
|
31
|
+
});
|
|
32
|
+
console.log(`Filled ${result.metadata.name}`);
|
|
33
|
+
console.log(`Output: ${result.outputPath}`);
|
|
34
|
+
console.log(`Fields used: ${result.fieldsUsed.join(', ')}`);
|
|
35
|
+
}
|
|
36
|
+
else if (isExternal) {
|
|
37
|
+
const result = await runExternalFill({
|
|
38
|
+
externalId: args.template,
|
|
39
|
+
outputPath: resolvedOutput,
|
|
40
|
+
values: args.values,
|
|
41
|
+
});
|
|
42
|
+
console.log(`Filled ${result.metadata.name}`);
|
|
43
|
+
console.log(`Output: ${result.outputPath}`);
|
|
44
|
+
console.log(`Fields used: ${result.fieldsUsed.join(', ')}`);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
const result = await fillTemplate({
|
|
48
|
+
templateDir,
|
|
49
|
+
values: args.values,
|
|
50
|
+
outputPath: resolvedOutput,
|
|
51
|
+
});
|
|
52
|
+
console.log(`Filled ${result.metadata.name}`);
|
|
53
|
+
console.log(`Output: ${result.outputPath}`);
|
|
54
|
+
console.log(`Fields used: ${result.fieldsUsed.join(', ')}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
console.error(`Error: ${err.message}`);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function getAvailableIds() {
|
|
63
|
+
const ids = [];
|
|
64
|
+
const templatesDir = getTemplatesDir();
|
|
65
|
+
if (existsSync(templatesDir)) {
|
|
66
|
+
ids.push(...readdirSync(templatesDir, { withFileTypes: true })
|
|
67
|
+
.filter((d) => d.isDirectory())
|
|
68
|
+
.map((d) => d.name));
|
|
69
|
+
}
|
|
70
|
+
const extDir = getExternalDir();
|
|
71
|
+
if (existsSync(extDir)) {
|
|
72
|
+
ids.push(...readdirSync(extDir, { withFileTypes: true })
|
|
73
|
+
.filter((d) => d.isDirectory())
|
|
74
|
+
.map((d) => d.name));
|
|
75
|
+
}
|
|
76
|
+
const recipesDir = getRecipesDir();
|
|
77
|
+
if (existsSync(recipesDir)) {
|
|
78
|
+
ids.push(...readdirSync(recipesDir, { withFileTypes: true })
|
|
79
|
+
.filter((d) => d.isDirectory())
|
|
80
|
+
.map((d) => d.name));
|
|
81
|
+
}
|
|
82
|
+
return ids;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=fill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fill.js","sourceRoot":"","sources":["../../src/commands/fill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAwBD,wBAAgB,OAAO,CAAC,IAAI,GAAE,WAAgB,GAAG,IAAI,CAMpD"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { readdirSync, existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { loadMetadata, loadRecipeMetadata, loadExternalMetadata } from '../core/metadata.js';
|
|
4
|
+
import { getTemplatesDir, resolveTemplateDir, getRecipesDir, resolveRecipeDir, getExternalDir, resolveExternalDir } from '../utils/paths.js';
|
|
5
|
+
const pkgPath = fileURLToPath(new URL('../../package.json', import.meta.url));
|
|
6
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
7
|
+
/** Extract a human-friendly source name from a URL */
|
|
8
|
+
function sourceName(url) {
|
|
9
|
+
try {
|
|
10
|
+
const host = new URL(url).hostname.replace(/^www\./, '');
|
|
11
|
+
const map = {
|
|
12
|
+
'commonpaper.com': 'Common Paper',
|
|
13
|
+
'bonterms.com': 'Bonterms',
|
|
14
|
+
'ycombinator.com': 'Y Combinator',
|
|
15
|
+
'bookface-static.ycombinator.com': 'Y Combinator',
|
|
16
|
+
'nvca.org': 'NVCA',
|
|
17
|
+
};
|
|
18
|
+
return map[host] ?? host;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function runList(opts = {}) {
|
|
25
|
+
if (opts.json || opts.jsonStrict) {
|
|
26
|
+
runListJson(opts);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
listAgreements();
|
|
30
|
+
}
|
|
31
|
+
function mapFields(fields) {
|
|
32
|
+
return fields.map((f) => ({
|
|
33
|
+
name: f.name,
|
|
34
|
+
type: f.type,
|
|
35
|
+
required: f.required,
|
|
36
|
+
section: f.section ?? null,
|
|
37
|
+
description: f.description,
|
|
38
|
+
default: f.default ?? null,
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
function runListJson(opts) {
|
|
42
|
+
const results = [];
|
|
43
|
+
const errors = [];
|
|
44
|
+
// Templates
|
|
45
|
+
const templatesDir = getTemplatesDir();
|
|
46
|
+
if (existsSync(templatesDir)) {
|
|
47
|
+
const dirs = readdirSync(templatesDir, { withFileTypes: true })
|
|
48
|
+
.filter((d) => d.isDirectory())
|
|
49
|
+
.map((d) => d.name);
|
|
50
|
+
for (const id of dirs) {
|
|
51
|
+
const dir = resolveTemplateDir(id);
|
|
52
|
+
try {
|
|
53
|
+
const meta = loadMetadata(dir);
|
|
54
|
+
results.push({
|
|
55
|
+
name: id,
|
|
56
|
+
description: meta.description ?? meta.name,
|
|
57
|
+
license: meta.license,
|
|
58
|
+
source_url: meta.source_url,
|
|
59
|
+
source: sourceName(meta.source_url),
|
|
60
|
+
attribution_text: meta.attribution_text,
|
|
61
|
+
fields: mapFields(meta.fields),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
errors.push(`template ${id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// External templates
|
|
70
|
+
const externalDir = getExternalDir();
|
|
71
|
+
if (existsSync(externalDir)) {
|
|
72
|
+
const dirs = readdirSync(externalDir, { withFileTypes: true })
|
|
73
|
+
.filter((d) => d.isDirectory())
|
|
74
|
+
.map((d) => d.name);
|
|
75
|
+
for (const id of dirs) {
|
|
76
|
+
const dir = resolveExternalDir(id);
|
|
77
|
+
try {
|
|
78
|
+
const meta = loadExternalMetadata(dir);
|
|
79
|
+
results.push({
|
|
80
|
+
name: id,
|
|
81
|
+
description: meta.description ?? meta.name,
|
|
82
|
+
license: meta.license,
|
|
83
|
+
source_url: meta.source_url,
|
|
84
|
+
source: sourceName(meta.source_url),
|
|
85
|
+
attribution_text: meta.attribution_text,
|
|
86
|
+
fields: mapFields(meta.fields),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
errors.push(`external ${id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Recipes
|
|
95
|
+
const recipesDir = getRecipesDir();
|
|
96
|
+
if (existsSync(recipesDir)) {
|
|
97
|
+
const dirs = readdirSync(recipesDir, { withFileTypes: true })
|
|
98
|
+
.filter((d) => d.isDirectory())
|
|
99
|
+
.map((d) => d.name);
|
|
100
|
+
for (const id of dirs) {
|
|
101
|
+
const dir = resolveRecipeDir(id);
|
|
102
|
+
try {
|
|
103
|
+
const meta = loadRecipeMetadata(dir);
|
|
104
|
+
results.push({
|
|
105
|
+
name: id,
|
|
106
|
+
description: meta.description ?? meta.name,
|
|
107
|
+
license_note: meta.license_note,
|
|
108
|
+
source_url: meta.source_url,
|
|
109
|
+
source: sourceName(meta.source_url),
|
|
110
|
+
source_version: meta.source_version,
|
|
111
|
+
optional: meta.optional,
|
|
112
|
+
fields: mapFields(meta.fields),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
errors.push(`recipe ${id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
results.sort((a, b) => a.name.localeCompare(b.name));
|
|
121
|
+
if (opts.jsonStrict && errors.length > 0) {
|
|
122
|
+
for (const msg of errors) {
|
|
123
|
+
console.error(`error: ${msg}`);
|
|
124
|
+
}
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
const envelope = {
|
|
128
|
+
schema_version: 1,
|
|
129
|
+
cli_version: pkg.version,
|
|
130
|
+
items: results,
|
|
131
|
+
};
|
|
132
|
+
console.log(JSON.stringify(envelope, null, 2));
|
|
133
|
+
}
|
|
134
|
+
/** Unified list of all agreements: templates + external + recipes */
|
|
135
|
+
function listAgreements() {
|
|
136
|
+
const rows = [];
|
|
137
|
+
const templatesDir = getTemplatesDir();
|
|
138
|
+
if (existsSync(templatesDir)) {
|
|
139
|
+
const dirs = readdirSync(templatesDir, { withFileTypes: true })
|
|
140
|
+
.filter((d) => d.isDirectory())
|
|
141
|
+
.map((d) => d.name);
|
|
142
|
+
for (const id of dirs) {
|
|
143
|
+
const dir = resolveTemplateDir(id);
|
|
144
|
+
try {
|
|
145
|
+
const meta = loadMetadata(dir);
|
|
146
|
+
const required = meta.fields.filter((f) => f.required).length;
|
|
147
|
+
rows.push({ id, license: meta.license, required, total: meta.fields.length, source: sourceName(meta.source_url) || '—', sourceUrl: meta.source_url });
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
rows.push({ id, license: 'ERROR', required: 0, total: 0, source: '—', sourceUrl: 'Could not load metadata' });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const externalDir = getExternalDir();
|
|
155
|
+
if (existsSync(externalDir)) {
|
|
156
|
+
const dirs = readdirSync(externalDir, { withFileTypes: true })
|
|
157
|
+
.filter((d) => d.isDirectory())
|
|
158
|
+
.map((d) => d.name);
|
|
159
|
+
for (const id of dirs) {
|
|
160
|
+
const dir = resolveExternalDir(id);
|
|
161
|
+
try {
|
|
162
|
+
const meta = loadExternalMetadata(dir);
|
|
163
|
+
const required = meta.fields.filter((f) => f.required).length;
|
|
164
|
+
rows.push({ id, license: meta.license, required, total: meta.fields.length, source: sourceName(meta.source_url) || '—', sourceUrl: meta.source_url });
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
rows.push({ id, license: 'ERROR', required: 0, total: 0, source: '—', sourceUrl: 'Could not load metadata' });
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const recipesDir = getRecipesDir();
|
|
172
|
+
if (existsSync(recipesDir)) {
|
|
173
|
+
const dirs = readdirSync(recipesDir, { withFileTypes: true })
|
|
174
|
+
.filter((d) => d.isDirectory())
|
|
175
|
+
.map((d) => d.name);
|
|
176
|
+
for (const id of dirs) {
|
|
177
|
+
const dir = resolveRecipeDir(id);
|
|
178
|
+
try {
|
|
179
|
+
const meta = loadRecipeMetadata(dir);
|
|
180
|
+
const required = meta.fields.filter((f) => f.required).length;
|
|
181
|
+
const license = meta.optional ? 'recipe*' : 'recipe';
|
|
182
|
+
rows.push({ id, license, required, total: meta.fields.length, source: sourceName(meta.source_url) || '—', sourceUrl: meta.source_url });
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
rows.push({ id, license: 'ERROR', required: 0, total: 0, source: '—', sourceUrl: 'Could not load metadata' });
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (rows.length === 0) {
|
|
190
|
+
console.log('No agreements found.');
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
rows.sort((a, b) => a.id.localeCompare(b.id));
|
|
194
|
+
console.log(`\n${'Agreement'.padEnd(40)} ${'License'.padEnd(14)} ${'Fields'.padEnd(8)} ${'Source'.padEnd(16)} URL`);
|
|
195
|
+
console.log('─'.repeat(120));
|
|
196
|
+
for (const row of rows) {
|
|
197
|
+
const fields = row.license === 'ERROR' ? '—' : `${row.required}/${row.total}`;
|
|
198
|
+
console.log(`${row.id.padEnd(40)} ${row.license.padEnd(14)} ${fields.padEnd(8)} ${row.source.padEnd(16)} ${row.sourceUrl}`);
|
|
199
|
+
}
|
|
200
|
+
console.log('');
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
|