open-agreements 0.2.0 → 0.2.2

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 (66) hide show
  1. package/README.md +10 -2
  2. package/content/templates/closing-checklist/metadata.yaml +6 -13
  3. package/content/templates/closing-checklist/template.docx +0 -0
  4. package/dist/cli/index.d.ts.map +1 -1
  5. package/dist/cli/index.js +47 -10
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/commands/checklist.d.ts +21 -1
  8. package/dist/commands/checklist.d.ts.map +1 -1
  9. package/dist/commands/checklist.js +175 -44
  10. package/dist/commands/checklist.js.map +1 -1
  11. package/dist/commands/recipe.js +3 -11
  12. package/dist/commands/recipe.js.map +1 -1
  13. package/dist/core/checklist/index.d.ts +22 -14
  14. package/dist/core/checklist/index.d.ts.map +1 -1
  15. package/dist/core/checklist/index.js +79 -39
  16. package/dist/core/checklist/index.js.map +1 -1
  17. package/dist/core/checklist/jsonl-stores.d.ts +3 -0
  18. package/dist/core/checklist/jsonl-stores.d.ts.map +1 -0
  19. package/dist/core/checklist/jsonl-stores.js +16 -0
  20. package/dist/core/checklist/jsonl-stores.js.map +1 -0
  21. package/dist/core/checklist/schemas.d.ts +2 -2
  22. package/dist/core/checklist/schemas.js +1 -1
  23. package/dist/core/checklist/schemas.js.map +1 -1
  24. package/dist/core/checklist/state-manager.d.ts +146 -0
  25. package/dist/core/checklist/state-manager.d.ts.map +1 -0
  26. package/dist/core/checklist/state-manager.js +147 -0
  27. package/dist/core/checklist/state-manager.js.map +1 -0
  28. package/dist/core/checklist/status-labels.d.ts +6 -0
  29. package/dist/core/checklist/status-labels.d.ts.map +1 -0
  30. package/dist/core/checklist/status-labels.js +29 -0
  31. package/dist/core/checklist/status-labels.js.map +1 -0
  32. package/dist/core/validation/recipe.d.ts.map +1 -1
  33. package/dist/core/validation/recipe.js +47 -61
  34. package/dist/core/validation/recipe.js.map +1 -1
  35. package/package.json +1 -1
  36. package/skills/cloud-service-agreement/SKILL.md +9 -0
  37. package/skills/data-privacy-agreement/SKILL.md +9 -0
  38. package/skills/delaware-franchise-tax/SKILL.md +56 -19
  39. package/skills/delaware-franchise-tax/reference/ecorp-portal-playwright-notes.md +136 -0
  40. package/skills/edit-docx-agreement/CONNECTORS.md +20 -0
  41. package/skills/edit-docx-agreement/SKILL.md +77 -0
  42. package/skills/employment-contract/SKILL.md +9 -0
  43. package/skills/iso-27001-evidence-collection/CONNECTORS.md +23 -0
  44. package/skills/iso-27001-evidence-collection/SKILL.md +300 -0
  45. package/skills/iso-27001-evidence-collection/rules/api-exports.md +191 -0
  46. package/skills/iso-27001-evidence-collection/rules/evidence-types.md +107 -0
  47. package/skills/iso-27001-evidence-collection/rules/screenshot-guide.md +77 -0
  48. package/skills/iso-27001-internal-audit/CONNECTORS.md +23 -0
  49. package/skills/iso-27001-internal-audit/SKILL.md +272 -0
  50. package/skills/iso-27001-internal-audit/rules/access-control.md +191 -0
  51. package/skills/iso-27001-internal-audit/rules/business-continuity.md +94 -0
  52. package/skills/iso-27001-internal-audit/rules/change-management.md +211 -0
  53. package/skills/iso-27001-internal-audit/rules/encryption.md +93 -0
  54. package/skills/iso-27001-internal-audit/rules/incident-response.md +127 -0
  55. package/skills/iso-27001-internal-audit/rules/isms-management.md +164 -0
  56. package/skills/iso-27001-internal-audit/rules/logging-monitoring.md +96 -0
  57. package/skills/iso-27001-internal-audit/rules/people-controls.md +161 -0
  58. package/skills/iso-27001-internal-audit/rules/supplier-management.md +92 -0
  59. package/skills/nda/SKILL.md +9 -0
  60. package/skills/open-agreements/SKILL.md +9 -0
  61. package/skills/safe/SKILL.md +9 -0
  62. package/skills/services-agreement/SKILL.md +9 -0
  63. package/skills/soc2-readiness/CONNECTORS.md +23 -0
  64. package/skills/soc2-readiness/SKILL.md +289 -0
  65. package/skills/soc2-readiness/rules/trust-services.md +230 -0
  66. package/skills/venture-financing/SKILL.md +9 -0
@@ -0,0 +1,147 @@
1
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { randomUUID } from 'node:crypto';
5
+ import { z } from 'zod';
6
+ import { appendJsonl, readJsonl } from './jsonl-stores.js';
7
+ import { ClosingChecklistSchema } from './schemas.js';
8
+ const STATE_ROOT = join(homedir(), '.open-agreements', 'checklists');
9
+ export const ChecklistStateSchema = z.object({
10
+ checklist_id: z.string().min(1),
11
+ revision: z.number().int().nonnegative(),
12
+ checklist: ClosingChecklistSchema,
13
+ });
14
+ function stateRoot(root) {
15
+ return root ?? STATE_ROOT;
16
+ }
17
+ function checklistDir(uuid, root) {
18
+ return join(stateRoot(root), uuid);
19
+ }
20
+ function statePath(uuid, root) {
21
+ return join(checklistDir(uuid, root), 'state.json');
22
+ }
23
+ function metaPath(uuid, root) {
24
+ return join(checklistDir(uuid, root), 'meta.json');
25
+ }
26
+ function historyPath(uuid, root) {
27
+ return join(checklistDir(uuid, root), 'history.jsonl');
28
+ }
29
+ function writeJson(path, value) {
30
+ writeFileSync(path, `${JSON.stringify(value, null, 2)}\n`, 'utf-8');
31
+ }
32
+ function readJson(path) {
33
+ return JSON.parse(readFileSync(path, 'utf-8'));
34
+ }
35
+ export function createChecklist(dealName, initialData, opts) {
36
+ const uuid = randomUUID();
37
+ const dir = checklistDir(uuid, opts?.root);
38
+ mkdirSync(dir, { recursive: true });
39
+ const now = new Date().toISOString().slice(0, 10);
40
+ const checklist = initialData ?? {
41
+ deal_name: dealName,
42
+ updated_at: now,
43
+ documents: {},
44
+ checklist_entries: {},
45
+ action_items: {},
46
+ issues: {},
47
+ };
48
+ const state = {
49
+ checklist_id: uuid,
50
+ revision: 0,
51
+ checklist,
52
+ };
53
+ const meta = {
54
+ deal_name: dealName,
55
+ created_at: now,
56
+ uuid,
57
+ };
58
+ writeJson(statePath(uuid, opts?.root), state);
59
+ writeJson(metaPath(uuid, opts?.root), meta);
60
+ return { uuid, dir };
61
+ }
62
+ export function listChecklists(opts) {
63
+ const root = stateRoot(opts?.root);
64
+ if (!existsSync(root))
65
+ return [];
66
+ const entries = readdirSync(root, { withFileTypes: true });
67
+ const results = [];
68
+ for (const entry of entries) {
69
+ if (!entry.isDirectory())
70
+ continue;
71
+ const mp = metaPath(entry.name, opts?.root);
72
+ const sp = statePath(entry.name, opts?.root);
73
+ if (!existsSync(mp) || !existsSync(sp))
74
+ continue;
75
+ try {
76
+ const meta = readJson(mp);
77
+ const state = readJson(sp);
78
+ results.push({
79
+ ...meta,
80
+ revision: state.revision,
81
+ updated_at: state.checklist.updated_at,
82
+ });
83
+ }
84
+ catch {
85
+ // Skip corrupt entries
86
+ }
87
+ }
88
+ return results.sort((a, b) => a.deal_name.localeCompare(b.deal_name));
89
+ }
90
+ export function resolveChecklist(nameOrId, opts) {
91
+ const root = stateRoot(opts?.root);
92
+ if (!existsSync(root))
93
+ return null;
94
+ // Exact UUID match
95
+ const exactDir = checklistDir(nameOrId, opts?.root);
96
+ if (existsSync(join(exactDir, 'state.json')))
97
+ return nameOrId;
98
+ // Fuzzy match by deal name
99
+ const entries = readdirSync(root, { withFileTypes: true });
100
+ const needle = nameOrId.toLowerCase();
101
+ for (const entry of entries) {
102
+ if (!entry.isDirectory())
103
+ continue;
104
+ const mp = metaPath(entry.name, opts?.root);
105
+ if (!existsSync(mp))
106
+ continue;
107
+ try {
108
+ const meta = readJson(mp);
109
+ if (meta.deal_name.toLowerCase() === needle)
110
+ return entry.name;
111
+ }
112
+ catch {
113
+ // Skip
114
+ }
115
+ }
116
+ // Substring match as fallback
117
+ for (const entry of entries) {
118
+ if (!entry.isDirectory())
119
+ continue;
120
+ const mp = metaPath(entry.name, opts?.root);
121
+ if (!existsSync(mp))
122
+ continue;
123
+ try {
124
+ const meta = readJson(mp);
125
+ if (meta.deal_name.toLowerCase().includes(needle))
126
+ return entry.name;
127
+ }
128
+ catch {
129
+ // Skip
130
+ }
131
+ }
132
+ return null;
133
+ }
134
+ export function getChecklistState(uuid, opts) {
135
+ const path = statePath(uuid, opts?.root);
136
+ return ChecklistStateSchema.parse(readJson(path));
137
+ }
138
+ export function saveChecklistState(uuid, state, opts) {
139
+ writeJson(statePath(uuid, opts?.root), state);
140
+ }
141
+ export async function appendHistory(uuid, record, opts) {
142
+ await appendJsonl(historyPath(uuid, opts?.root), record);
143
+ }
144
+ export function getHistory(uuid, opts) {
145
+ return readJsonl(historyPath(uuid, opts?.root));
146
+ }
147
+ //# sourceMappingURL=state-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-manager.js","sourceRoot":"","sources":["../../../src/core/checklist/state-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Human-readable labels for checklist enum statuses.
3
+ */
4
+ export declare const STATUS_LABELS: Record<string, string>;
5
+ export declare function humanStatus(status: string): string;
6
+ //# sourceMappingURL=status-labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-labels.d.ts","sourceRoot":"","sources":["../../../src/core/checklist/status-labels.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAwBhD,CAAC;AAEF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAElD"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Human-readable labels for checklist enum statuses.
3
+ */
4
+ export const STATUS_LABELS = {
5
+ // ChecklistEntryStatusEnum
6
+ NOT_STARTED: 'Not Started',
7
+ DRAFT: 'Draft',
8
+ CIRCULATED: 'Circulated',
9
+ FORM_FINAL: 'Form Final',
10
+ PARTIALLY_SIGNED: 'Partially Signed',
11
+ FULLY_EXECUTED: 'Fully Executed',
12
+ DELIVERED: 'Delivered',
13
+ FILED_OR_RECORDED: 'Filed / Recorded',
14
+ // ChecklistItemStatusEnum (action items)
15
+ IN_PROGRESS: 'In Progress',
16
+ COMPLETED: 'Completed',
17
+ ON_HOLD: 'On Hold',
18
+ // SignatoryStatusEnum
19
+ PENDING: 'Pending',
20
+ RECEIVED: 'Received',
21
+ N_A: 'N/A',
22
+ // IssueStatusEnum
23
+ OPEN: 'Open',
24
+ CLOSED: 'Closed',
25
+ };
26
+ export function humanStatus(status) {
27
+ return STATUS_LABELS[status] ?? status;
28
+ }
29
+ //# sourceMappingURL=status-labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-labels.js","sourceRoot":"","sources":["../../../src/core/checklist/status-labels.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,2BAA2B;IAC3B,WAAW,EAAE,aAAa;IAC1B,KAAK,EAAE,OAAO;IACd,UAAU,EAAE,YAAY;IACxB,UAAU,EAAE,YAAY;IACxB,gBAAgB,EAAE,kBAAkB;IACpC,cAAc,EAAE,gBAAgB;IAChC,SAAS,EAAE,WAAW;IACtB,iBAAiB,EAAE,kBAAkB;IAErC,yCAAyC;IACzC,WAAW,EAAE,aAAa;IAC1B,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAElB,sBAAsB;IACtB,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,GAAG,EAAE,KAAK;IAEV,kBAAkB;IAClB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;AACzC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../../src/core/validation/recipe.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AASD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,sBAAsB,CAmJxB"}
1
+ {"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../../src/core/validation/recipe.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AASD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,sBAAsB,CAwIxB"}
@@ -48,12 +48,8 @@ export function validateRecipe(recipeDir, recipeId, options) {
48
48
  ComputedProfileSchema.parse(JSON.parse(raw));
49
49
  }
50
50
  catch (err) {
51
- if (err instanceof Error) {
52
- errors.push(`computed.json: ${err.message}`);
53
- }
54
- else {
55
- errors.push('computed.json: invalid format');
56
- }
51
+ const message = err instanceof Error ? err.message : 'invalid format';
52
+ errors.push(`computed.json: ${message}`);
57
53
  }
58
54
  }
59
55
  if (isScaffold) {
@@ -65,68 +61,58 @@ export function validateRecipe(recipeDir, recipeId, options) {
65
61
  }
66
62
  return { recipeId, valid: errors.length === 0, scaffold: true, errors, warnings };
67
63
  }
68
- // Validate replacements.json
69
- if (hasReplacements) {
70
- try {
71
- const raw = readFileSync(join(recipeDir, 'replacements.json'), 'utf-8');
72
- const replacements = JSON.parse(raw);
73
- if (typeof replacements !== 'object' || replacements === null) {
74
- errors.push('replacements.json must be a JSON object');
75
- }
76
- else {
77
- const unknownTargets = new Set();
78
- for (const [key, value] of Object.entries(replacements)) {
79
- if (typeof value !== 'string') {
80
- errors.push(`replacements.json: value for "${key}" must be a string`);
81
- continue;
82
- }
83
- // Value must contain at least one {identifier} tag
84
- const tags = value.match(TAG_RE);
85
- if (!tags || tags.length === 0) {
86
- errors.push(`replacements.json: value for "${key}" must contain at least one {identifier} tag, got "${value}"`);
87
- }
88
- // All curly-brace tokens in value must be safe identifiers (no control tags)
89
- const allBraces = value.match(ANY_BRACE_RE);
90
- if (allBraces) {
91
- for (const token of allBraces) {
92
- if (!SAFE_TAG_RE.test(token)) {
93
- errors.push(`replacements.json: unsafe tag "${token}" in value for "${key}". Only {identifier} tags allowed.`);
94
- continue;
95
- }
96
- const fieldName = token.slice(1, -1);
97
- if (!metadataFieldNames.has(fieldName)) {
98
- unknownTargets.add(fieldName);
99
- }
64
+ // Validate replacements.json for runnable recipes.
65
+ try {
66
+ const raw = readFileSync(join(recipeDir, 'replacements.json'), 'utf-8');
67
+ const replacements = JSON.parse(raw);
68
+ if (typeof replacements !== 'object' || replacements === null) {
69
+ errors.push('replacements.json must be a JSON object');
70
+ }
71
+ else {
72
+ const unknownTargets = new Set();
73
+ for (const [key, value] of Object.entries(replacements)) {
74
+ if (typeof value !== 'string') {
75
+ errors.push(`replacements.json: value for "${key}" must be a string`);
76
+ continue;
77
+ }
78
+ // Value must contain at least one {identifier} tag
79
+ const tags = value.match(TAG_RE);
80
+ if (!tags || tags.length === 0) {
81
+ errors.push(`replacements.json: value for "${key}" must contain at least one {identifier} tag, got "${value}"`);
82
+ }
83
+ // All curly-brace tokens in value must be safe identifiers (no control tags)
84
+ const allBraces = value.match(ANY_BRACE_RE);
85
+ if (allBraces) {
86
+ for (const token of allBraces) {
87
+ if (!SAFE_TAG_RE.test(token)) {
88
+ errors.push(`replacements.json: unsafe tag "${token}" in value for "${key}". Only {identifier} tags allowed.`);
89
+ continue;
90
+ }
91
+ const fieldName = token.slice(1, -1);
92
+ if (!metadataFieldNames.has(fieldName)) {
93
+ unknownTargets.add(fieldName);
100
94
  }
101
95
  }
102
- // Value must not contain the source key (infinite loop prevention)
103
- // For qualified keys, check against the searchText, not the full key.
104
- // Nth keys use single-shot replacement so they can't loop — skip the check.
105
- const parsed = parseReplacementKey(key, value);
106
- if (parsed.type === 'simple' && value.includes(parsed.searchText)) {
107
- errors.push(`replacements.json: value for "${key}" contains the key itself (would cause infinite loop)`);
108
- }
109
- else if (parsed.type === 'context' && value.includes(parsed.searchText)) {
110
- errors.push(`replacements.json: value for "${key}" contains the search text "${parsed.searchText}" (would cause infinite loop)`);
111
- }
112
- // nth keys: no infinite-loop check needed (single-shot replacement)
113
96
  }
114
- for (const fieldName of unknownTargets) {
115
- warnings.push(`Replacement target {${fieldName}} not found in metadata fields`);
97
+ // Value must not contain the source key (infinite loop prevention)
98
+ // For qualified keys, check against the searchText, not the full key.
99
+ // Nth keys use single-shot replacement so they can't loop — skip the check.
100
+ const parsed = parseReplacementKey(key, value);
101
+ if (parsed.type === 'simple' && value.includes(parsed.searchText)) {
102
+ errors.push(`replacements.json: value for "${key}" contains the key itself (would cause infinite loop)`);
103
+ }
104
+ else if (parsed.type === 'context' && value.includes(parsed.searchText)) {
105
+ errors.push(`replacements.json: value for "${key}" contains the search text "${parsed.searchText}" (would cause infinite loop)`);
116
106
  }
107
+ // nth keys: no infinite-loop check needed (single-shot replacement)
108
+ }
109
+ for (const fieldName of unknownTargets) {
110
+ warnings.push(`Replacement target {${fieldName}} not found in metadata fields`);
117
111
  }
118
- }
119
- catch (err) {
120
- errors.push(`replacements.json: ${err.message}`);
121
112
  }
122
113
  }
123
- else {
124
- if (strict) {
125
- errors.push('replacements.json not found (required for runnable recipes)');
126
- }
127
- else {
128
- warnings.push('replacements.json not found (required for runnable recipes)');
129
- }
114
+ catch (err) {
115
+ errors.push(`replacements.json: ${err.message}`);
130
116
  }
131
117
  // Validate clean.json if present
132
118
  const cleanPath = join(recipeDir, 'clean.json');
@@ -1 +1 @@
1
- {"version":3,"file":"recipe.js","sourceRoot":"","sources":["../../../src/core/validation/recipe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recipe.js","sourceRoot":"","sources":["../../../src/core/validation/recipe.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "open-agreements",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "workspaces": [
5
5
  "packages/allure-test-factory",
6
6
  "packages/contract-templates-mcp",
@@ -170,3 +170,12 @@ Use `list_templates` (MCP) or `list --json` (CLI) for the latest inventory and f
170
170
  - All templates produce Word DOCX files preserving original formatting
171
171
  - Templates are licensed by their respective authors (CC-BY-4.0 or CC0-1.0)
172
172
  - This tool does not provide legal advice — consult an attorney
173
+
174
+ ## Bespoke edits (beyond template fields)
175
+
176
+ If you need to edit boilerplate or add custom language that is not exposed as a template field,
177
+ use the `edit-docx-agreement` skill to surgically edit the generated DOCX and produce a
178
+ tracked-changes output for review. This requires a separately configured Safe Docx MCP server.
179
+
180
+ Note: templates licensed under CC-BY-ND-4.0 (e.g., YC SAFEs) can be filled for your own use
181
+ but must not be redistributed in modified form.
@@ -156,3 +156,12 @@ Use `list_templates` (MCP) or `list --json` (CLI) for the latest inventory and f
156
156
  - Templates are licensed by their respective authors (CC-BY-4.0 or CC0-1.0)
157
157
  - DPAs and BAAs are regulatory documents — ensure they meet your jurisdiction's specific requirements
158
158
  - This tool does not provide legal advice — consult an attorney
159
+
160
+ ## Bespoke edits (beyond template fields)
161
+
162
+ If you need to edit boilerplate or add custom language that is not exposed as a template field,
163
+ use the `edit-docx-agreement` skill to surgically edit the generated DOCX and produce a
164
+ tracked-changes output for review. This requires a separately configured Safe Docx MCP server.
165
+
166
+ Note: templates licensed under CC-BY-ND-4.0 (e.g., YC SAFEs) can be filled for your own use
167
+ but must not be redistributed in modified form.
@@ -23,8 +23,8 @@ File your Delaware annual franchise tax and annual report.
23
23
  ## Security model
24
24
 
25
25
  - This skill **does not** download or execute any code.
26
- - It **does not** access the Delaware eCorp portal programmatically (the portal prohibits automated tools).
27
26
  - All portal interactions are performed by the user, guided step-by-step by the agent.
27
+ - If the user opts in to browser automation (Playwright via CDP), the agent may assist with portal navigation — but credit card and banking details must **always** be entered by the user directly.
28
28
 
29
29
  ## When to Use
30
30
 
@@ -117,28 +117,64 @@ Total due: $XXX + $50 = $XXX
117
117
 
118
118
  ## Phase 3: File via Portal
119
119
 
120
- Guide the user step by step. The agent reads instructions aloud; the user operates the browser.
120
+ The agent can automate the portal using Playwright if Chrome is running with remote debugging enabled. Otherwise, guide the user step-by-step.
121
+
122
+ ### Automation Setup (Playwright via CDP)
123
+
124
+ If the user says "use playwright", "use the browser" or requests similar automation:
125
+
126
+ 1. **Launch Chrome with remote debugging** (see `reference/ecorp-portal-playwright-notes.md` for commands)
127
+ 2. **Connect via Playwright** (see reference for CDP connection snippet)
128
+ 3. **Portal field reference**: See `reference/ecorp-portal-playwright-notes.md` for:
129
+ - All field selector IDs
130
+ - Date field workaround (must use JS `el.value =` not Playwright `.fill()`)
131
+ - State dropdown abbreviations (use `value="NY"` not `label="New York"`)
132
+ - Director name fields (separate first/middle/last fields, NOT one name field)
133
+ - APVC activation sequence
134
+ - Session/eId behavior
135
+
136
+ ### Filing Steps
121
137
 
122
138
  1. **Navigate**: Open https://icis.corp.delaware.gov/ecorp/logintax.aspx
123
139
  2. **Login**: Enter Business Entity File Number. Solve CAPTCHA (if the user shares a screenshot, the agent can try to read it). Click **Continue**.
124
140
  3. **Entity verification**: Confirm entity name, registered agent, and registered office match your records.
125
- 4. **Officers and directors**: Review and confirm or update names and addresses. Enter Nature of Business if prompted.
126
- 5. **Stock information**: Enter authorized shares, par value, issued shares, and gross assets for each class.
127
- 6. **Tax method**: Select **Assumed Par Value Capital Method** (or whichever method produced the lower tax). Verify the displayed tax matches your calculation from Phase 2. If it does not match, stop and troubleshoot before proceeding.
128
- 7. **Payment**: Enter credit card or ACH details. Total = tax + filing fee. **Click Submit ONCE** — the portal warns about duplicate charges on double-click. If tax exceeds $5,000, ACH payment is required.
129
- 8. **Confirmation**: Save the confirmation number. Screenshot the confirmation page.
130
-
131
- ## Phase 4: Record and Remind
132
-
133
- Save a filing record with the following details:
134
- - Entity name
135
- - Delaware file number
136
- - Tax year
137
- - Calculation method used and intermediate values
138
- - Amount paid (tax + filing fee)
139
- - Confirmation number
140
- - Date filed
141
- - Next due date (March 1 of next year for corps, June 1 for LLCs)
141
+ 4. **Fill form fields** (all on one page):
142
+ - **Stock info**: Issued shares (per-class field, NOT the readonly total), gross assets, asset date (must == fiscal year end)
143
+ - **Address**: Principal business address with state abbreviation
144
+ - **Nature of business**: Select from dropdown (e.g., "Technology/Software")
145
+ - **Officer**: First/middle/last name, title, address
146
+ - **Directors**: Set total count, click "Enter Directors Info", fill first/middle/last name + address for each
147
+ - **Authorization**: First/middle/last name, title, address
148
+ - **T&C checkbox**: Must check `chkCertify` before continuing
149
+ 5. **Recalculate tax**: Click "Recalculate Tax" button. Verify the displayed tax matches your calculation from Phase 2. If it still shows the Authorized Shares method amount, the asset date is probably wrong — fix it via JavaScript.
150
+ 6. **Review**: Click "Continue Filing" to see the Review Copy. Verify all data.
151
+ 7. **Payment**: Click "Proceed to Payment". The agent **must stop here** — credit card and banking details must be entered by the user. If tax exceeds $5,000, ACH payment is required.
152
+ 8. **Confirmation**: After payment:
153
+ - Click **"Display Confirmation Copy"** (`onclick="downloadConfirmation();return false;"`) to save receipt PDF
154
+ - Click **"Email Confirmation Copy"** to email the filed report (opens popup at `Email.aspx`, enter email address)
155
+ - **CRITICAL**: "Once you leave this screen, you will no longer be able to obtain a confirmation copy" — save/email before navigating away
156
+ - Record the Service Request Number from the URL: `srNo=XXXXX`
157
+
158
+ ## Phase 4: Save Receipt and Remind
159
+
160
+ ### Save the confirmation PDF
161
+
162
+ The downloaded confirmation PDF **is** the filing record — no need to create a separate one.
163
+
164
+ The portal downloads the receipt as `Ecorp_Confirmation_<ServiceRequestNumber>.pdf` to the default Downloads folder. Move it to a durable location:
165
+ - `~/Documents/Tax/Delaware/<EntityName>/` on local disk
166
+ - A "Tax" or "Corporate Records" folder in cloud storage if available
167
+ - Keep the original filename — it contains the Service Request Number for future reference
168
+
169
+ ```bash
170
+ # Example
171
+ mkdir -p ~/Documents/Tax/Delaware/My-Corp-Name
172
+ mv ~/Downloads/Ecorp_Confirmation_*.pdf ~/Documents/Tax/Delaware/My-Corp-Name/
173
+ ```
174
+
175
+ Ask the user where they keep tax records and move the file there.
176
+
177
+ ### Set a reminder
142
178
 
143
179
  Remind the user to set an annual reminder for approximately 2 weeks before the deadline:
144
180
  - **Mid-February** for corporations (March 1 deadline)
@@ -156,6 +192,7 @@ For detailed calculation formulas and official guidance, see the `reference/` di
156
192
  - `reference/tax-calculation.md` — full formulas for both methods with examples
157
193
  - `reference/filing-instructions.md` — fees, payment methods, deadlines
158
194
  - `reference/faq.md` — frequently asked questions
195
+ - `reference/ecorp-portal-playwright-notes.md` — field selectors, gotchas, and automation tips for the eCorp portal
159
196
 
160
197
  **Official source**: https://corp.delaware.gov/paytaxes/
161
198
  **Help line**: 302-739-3073, Option 3