markform 0.1.7 → 0.1.8

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 (33) hide show
  1. package/README.md +420 -198
  2. package/dist/ai-sdk.d.mts +1 -1
  3. package/dist/ai-sdk.mjs +2 -2
  4. package/dist/{apply-g23rRn7p.mjs → apply-BUU2QcJ2.mjs} +102 -20
  5. package/dist/bin.mjs +1 -1
  6. package/dist/{cli-Bqlm-WWw.mjs → cli-BZh25bvy.mjs} +26 -8
  7. package/dist/cli.mjs +1 -1
  8. package/dist/{coreTypes-DCvD7feM.d.mts → coreTypes-BSPJ9H27.d.mts} +51 -1
  9. package/dist/{coreTypes-__Cwxz5q.mjs → coreTypes-DJtu8OOp.mjs} +16 -1
  10. package/dist/index.d.mts +10 -5
  11. package/dist/index.mjs +4 -4
  12. package/dist/{session-CgCNni0e.mjs → session-CmHdAPyg.mjs} +1 -1
  13. package/dist/{session-DruaYPZ1.mjs → session-DSTNiHza.mjs} +1 -1
  14. package/dist/{src-BiuxbzF3.mjs → src-kUggXhN1.mjs} +115 -29
  15. package/docs/markform-apis.md +30 -1
  16. package/docs/markform-reference.md +65 -6
  17. package/examples/movie-research/movie-research-deep.form.md +15 -56
  18. package/examples/movie-research/movie-research-demo.form.md +25 -34
  19. package/examples/rejection-test/rejection-test-mock-filled.form.md +41 -0
  20. package/examples/rejection-test/rejection-test-mock-filled.report.md +15 -0
  21. package/examples/rejection-test/rejection-test-mock-filled.schema.json +59 -0
  22. package/examples/rejection-test/rejection-test-mock-filled.yml +13 -0
  23. package/examples/rejection-test/rejection-test.form.md +35 -0
  24. package/examples/rejection-test/rejection-test.session.yaml +88 -0
  25. package/examples/simple/simple-mock-filled.report.md +96 -0
  26. package/examples/simple/simple-mock-filled.schema.json +374 -0
  27. package/examples/simple/simple-mock-filled.yml +87 -0
  28. package/examples/simple/simple-skipped-filled.report.md +90 -0
  29. package/examples/simple/simple-skipped-filled.schema.json +374 -0
  30. package/examples/simple/simple-skipped-filled.yml +77 -0
  31. package/examples/simple/simple-with-skips.session.yaml +3 -3
  32. package/examples/simple/simple.session.yaml +3 -3
  33. package/package.json +1 -1
@@ -0,0 +1,15 @@
1
+ # Rejection Test Form
2
+
3
+ A form to test patch rejection scenarios - verifies that type mismatch
4
+ errors are properly recorded and recovery works.
5
+
6
+ ## Test Fields
7
+
8
+ **Ratings:**
9
+ | Source | Score | Votes |
10
+ | --- | --- | --- |
11
+ | IMDB | 85 | 12500 |
12
+ | Rotten Tomatoes | 92 | 450 |
13
+
14
+ **Title:**
15
+ Test Movie
@@ -0,0 +1,59 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "rejection_test",
4
+ "type": "object",
5
+ "properties": {
6
+ "ratings": {
7
+ "type": "array",
8
+ "items": {
9
+ "type": "object",
10
+ "properties": {
11
+ "source": {
12
+ "title": "Source",
13
+ "type": "string"
14
+ },
15
+ "score": {
16
+ "title": "Score",
17
+ "type": "number"
18
+ },
19
+ "votes": {
20
+ "title": "Votes",
21
+ "type": "number"
22
+ }
23
+ }
24
+ },
25
+ "title": "Ratings",
26
+ "minItems": 1,
27
+ "maxItems": 5,
28
+ "x-markform": {
29
+ "role": "agent",
30
+ "group": "fields"
31
+ }
32
+ },
33
+ "title": {
34
+ "type": "string",
35
+ "title": "Title",
36
+ "x-markform": {
37
+ "role": "agent",
38
+ "group": "fields"
39
+ }
40
+ }
41
+ },
42
+ "title": "Rejection Test Form",
43
+ "description": "A form to test patch rejection scenarios - verifies that type mismatch\nerrors are properly recorded and recovery works.",
44
+ "required": ["ratings", "title"],
45
+ "x-markform": {
46
+ "spec": "MF/0.1",
47
+ "roles": ["user", "agent"],
48
+ "roleInstructions": {
49
+ "user": "Fill in the fields you have direct knowledge of.",
50
+ "agent": "Complete the remaining fields based on the provided context."
51
+ },
52
+ "groups": [
53
+ {
54
+ "id": "fields",
55
+ "title": "Test Fields"
56
+ }
57
+ ]
58
+ }
59
+ }
@@ -0,0 +1,13 @@
1
+ values:
2
+ ratings:
3
+ state: answered
4
+ value:
5
+ - source: IMDB
6
+ score: 85
7
+ votes: 12500
8
+ - source: Rotten Tomatoes
9
+ score: 92
10
+ votes: 450
11
+ title:
12
+ state: answered
13
+ value: Test Movie
@@ -0,0 +1,35 @@
1
+ ---
2
+ markform:
3
+ spec: MF/0.1
4
+ title: Rejection Test Form
5
+ description: "Tests type mismatch rejection and recovery behavior"
6
+ roles:
7
+ - agent
8
+ ---
9
+
10
+ {% form id="rejection_test" title="Rejection Test Form" %}
11
+
12
+ {% description ref="rejection_test" %}
13
+ A form to test patch rejection scenarios - verifies that type mismatch
14
+ errors are properly recorded and recovery works.
15
+ {% /description %}
16
+
17
+ {% group id="fields" title="Test Fields" %}
18
+
19
+ {% field kind="table" id="ratings" label="Ratings" required=true minRows=1 maxRows=5
20
+ columnIds=["source", "score", "votes"]
21
+ columnLabels=["Source", "Score", "Votes"]
22
+ columnTypes=["string", "number", "number"] %}
23
+ | Source | Score | Votes |
24
+ |--------|-------|-------|
25
+ {% /field %}
26
+
27
+ {% instructions ref="ratings" %}
28
+ Enter rating data with source name, score (0-100), and vote count.
29
+ {% /instructions %}
30
+
31
+ {% field kind="string" id="title" label="Title" required=true %}{% /field %}
32
+
33
+ {% /group %}
34
+
35
+ {% /form %}
@@ -0,0 +1,88 @@
1
+ session_version: 0.1.0
2
+ mode: mock
3
+ form:
4
+ path: rejection-test.form.md
5
+ mock:
6
+ completed_mock: rejection-test-mock-filled.form.md
7
+ harness:
8
+ max_turns: 100
9
+ max_patches_per_turn: 20
10
+ max_issues_per_turn: 10
11
+ target_roles:
12
+ - '*'
13
+ fill_mode: continue
14
+ turns:
15
+ - turn: 1
16
+ inspect:
17
+ issues:
18
+ - ref: ratings
19
+ scope: field
20
+ reason: required_missing
21
+ message: Required field "Ratings" is empty
22
+ severity: required
23
+ priority: 1
24
+ - ref: title
25
+ scope: field
26
+ reason: required_missing
27
+ message: Required field "Title" is empty
28
+ severity: required
29
+ priority: 1
30
+ apply:
31
+ patches:
32
+ - op: set_string
33
+ field_id: ratings
34
+ value: Intentional type mismatch - testing rejection feedback
35
+ - op: set_string
36
+ field_id: title
37
+ value: Test Movie
38
+ rejected_patches:
39
+ - patch_index: 0
40
+ message: Cannot apply set_string to table field "ratings"
41
+ field_id: ratings
42
+ field_kind: table
43
+ column_ids:
44
+ - source
45
+ - score
46
+ - votes
47
+ after:
48
+ required_issue_count: 2
49
+ markdown_sha256: 4edc8e8f1e858aafa657f32e1c2e56c4bfbe93b37224e1010eb6883c111e1c86
50
+ answered_field_count: 0
51
+ skipped_field_count: 0
52
+ - turn: 2
53
+ inspect:
54
+ issues:
55
+ - ref: ratings
56
+ scope: field
57
+ reason: required_missing
58
+ message: Required field "Ratings" is empty
59
+ severity: required
60
+ priority: 1
61
+ - ref: title
62
+ scope: field
63
+ reason: required_missing
64
+ message: Required field "Title" is empty
65
+ severity: required
66
+ priority: 1
67
+ apply:
68
+ patches:
69
+ - op: set_table
70
+ field_id: ratings
71
+ rows:
72
+ - source: IMDB
73
+ score: 85
74
+ votes: 12500
75
+ - source: Rotten Tomatoes
76
+ score: 92
77
+ votes: 450
78
+ - op: set_string
79
+ field_id: title
80
+ value: Test Movie
81
+ after:
82
+ required_issue_count: 0
83
+ markdown_sha256: f45e7cd87b036d57564e3340dec33c1dc5c2094d880e52b903f64da19b3b8ec0
84
+ answered_field_count: 2
85
+ skipped_field_count: 0
86
+ final:
87
+ expect_complete: true
88
+ expected_completed_form: rejection-test-mock-filled.form.md
@@ -0,0 +1,96 @@
1
+ # Simple Test Form
2
+
3
+ A fully interactive form demonstrating all Markform v0.1 field types.
4
+ Fill all fields using interactive prompts - no LLM API key needed.
5
+
6
+ ## Basic Fields
7
+
8
+ **Name:**
9
+ Alice Johnson
10
+
11
+ **Email:**
12
+ alice@example.com
13
+
14
+ **Age:**
15
+ 32
16
+
17
+ **Score:**
18
+ 87.5
19
+
20
+ ## List Fields
21
+
22
+ **Tags:**
23
+ - typescript
24
+ - testing
25
+ - forms
26
+
27
+ ## Selection Fields
28
+
29
+ **Priority:**
30
+ Medium
31
+
32
+ **Categories:**
33
+ - Frontend
34
+ - Backend
35
+
36
+ ## Checkbox Fields
37
+
38
+ **Tasks (Multi Mode):**
39
+ - [x] Research
40
+ - [x] Design
41
+ - [x] Implement
42
+ - [-] Test
43
+
44
+ **Agreements (Simple Mode):**
45
+ - [x] I have read the guidelines
46
+ - [x] I agree to the terms
47
+
48
+ **Confirmations (Explicit Mode):**
49
+ - [x] Data has been backed up
50
+ - [ ] Stakeholders notified
51
+
52
+ ## URL Fields
53
+
54
+ **Website:**
55
+ https://alice.dev
56
+
57
+ **References:**
58
+ - https://docs.example.com/guide
59
+ - https://github.com/example/project
60
+ - https://medium.com/article-about-forms
61
+
62
+ ## Date and Year Fields
63
+
64
+ **Event Date:**
65
+ 2025-06-15
66
+
67
+ **Founded Year:**
68
+ 2020
69
+
70
+ ## Table Fields
71
+
72
+ **Team Members:**
73
+ | Name | Role | Start Date |
74
+ | --- | --- | --- |
75
+ | Alice | Engineer | 2024-01-15 |
76
+ | Bob | Designer | 2023-06-01 |
77
+
78
+ **Project Tasks:**
79
+ _(empty)_
80
+
81
+ ## Optional Fields
82
+
83
+ **Notes:**
84
+ This is a test note.
85
+
86
+ **Optional Number:**
87
+ _(empty)_
88
+
89
+ **Related URL:**
90
+ https://markform.dev/docs
91
+
92
+ **Optional Date:**
93
+ _(empty)_
94
+
95
+ **Optional Year:**
96
+ _(empty)_
@@ -0,0 +1,374 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "simple_test",
4
+ "type": "object",
5
+ "properties": {
6
+ "name": {
7
+ "type": "string",
8
+ "title": "Name",
9
+ "minLength": 2,
10
+ "maxLength": 50,
11
+ "x-markform": {
12
+ "role": "user",
13
+ "group": "basic_fields",
14
+ "placeholder": "Enter your name",
15
+ "examples": ["John Smith", "Jane Doe"]
16
+ }
17
+ },
18
+ "email": {
19
+ "type": "string",
20
+ "title": "Email",
21
+ "pattern": "^[^@]+@[^@]+\\.[^@]+$",
22
+ "x-markform": {
23
+ "role": "user",
24
+ "group": "basic_fields",
25
+ "placeholder": "email@example.com",
26
+ "examples": ["alice@company.com", "bob@example.org"]
27
+ }
28
+ },
29
+ "age": {
30
+ "type": "integer",
31
+ "title": "Age",
32
+ "minimum": 0,
33
+ "maximum": 150,
34
+ "x-markform": {
35
+ "role": "user",
36
+ "group": "basic_fields",
37
+ "placeholder": "25",
38
+ "examples": ["18", "30", "45"]
39
+ }
40
+ },
41
+ "score": {
42
+ "type": "number",
43
+ "title": "Score",
44
+ "minimum": 0,
45
+ "maximum": 100,
46
+ "x-markform": {
47
+ "role": "user",
48
+ "group": "basic_fields",
49
+ "placeholder": "85.5",
50
+ "examples": ["75.0", "90.5", "100.0"]
51
+ }
52
+ },
53
+ "tags": {
54
+ "type": "array",
55
+ "items": {
56
+ "type": "string",
57
+ "minLength": 2
58
+ },
59
+ "title": "Tags",
60
+ "minItems": 1,
61
+ "maxItems": 5,
62
+ "uniqueItems": true,
63
+ "x-markform": {
64
+ "role": "user",
65
+ "group": "list_fields"
66
+ }
67
+ },
68
+ "priority": {
69
+ "type": "string",
70
+ "enum": ["low", "medium", "high"],
71
+ "title": "Priority",
72
+ "x-markform": {
73
+ "role": "user",
74
+ "group": "selection_fields"
75
+ }
76
+ },
77
+ "categories": {
78
+ "type": "array",
79
+ "items": {
80
+ "type": "string",
81
+ "enum": ["frontend", "backend", "database", "devops"]
82
+ },
83
+ "title": "Categories",
84
+ "minItems": 1,
85
+ "maxItems": 3,
86
+ "x-markform": {
87
+ "role": "user",
88
+ "group": "selection_fields"
89
+ }
90
+ },
91
+ "tasks_multi": {
92
+ "type": "object",
93
+ "properties": {
94
+ "research": {
95
+ "type": "string",
96
+ "enum": ["todo", "done", "incomplete", "active", "na"],
97
+ "title": "Research"
98
+ },
99
+ "design": {
100
+ "type": "string",
101
+ "enum": ["todo", "done", "incomplete", "active", "na"],
102
+ "title": "Design"
103
+ },
104
+ "implement": {
105
+ "type": "string",
106
+ "enum": ["todo", "done", "incomplete", "active", "na"],
107
+ "title": "Implement"
108
+ },
109
+ "test": {
110
+ "type": "string",
111
+ "enum": ["todo", "done", "incomplete", "active", "na"],
112
+ "title": "Test"
113
+ }
114
+ },
115
+ "title": "Tasks (Multi Mode)",
116
+ "x-markform": {
117
+ "role": "user",
118
+ "group": "checkbox_fields",
119
+ "checkboxMode": "multi"
120
+ }
121
+ },
122
+ "tasks_simple": {
123
+ "type": "object",
124
+ "properties": {
125
+ "read_guidelines": {
126
+ "type": "string",
127
+ "enum": ["todo", "done"],
128
+ "title": "I have read the guidelines"
129
+ },
130
+ "agree_terms": {
131
+ "type": "string",
132
+ "enum": ["todo", "done"],
133
+ "title": "I agree to the terms"
134
+ }
135
+ },
136
+ "title": "Agreements (Simple Mode)",
137
+ "x-markform": {
138
+ "role": "user",
139
+ "group": "checkbox_fields",
140
+ "checkboxMode": "simple"
141
+ }
142
+ },
143
+ "confirmations": {
144
+ "type": "object",
145
+ "properties": {
146
+ "backed_up": {
147
+ "type": "string",
148
+ "enum": ["unfilled", "yes", "no"],
149
+ "title": "Data has been backed up"
150
+ },
151
+ "notified": {
152
+ "type": "string",
153
+ "enum": ["unfilled", "yes", "no"],
154
+ "title": "Stakeholders notified"
155
+ }
156
+ },
157
+ "title": "Confirmations (Explicit Mode)",
158
+ "x-markform": {
159
+ "role": "user",
160
+ "group": "checkbox_fields",
161
+ "checkboxMode": "explicit"
162
+ }
163
+ },
164
+ "website": {
165
+ "type": "string",
166
+ "format": "uri",
167
+ "title": "Website",
168
+ "x-markform": {
169
+ "role": "user",
170
+ "group": "url_fields",
171
+ "placeholder": "https://example.com",
172
+ "examples": ["https://github.com/user/repo", "https://company.com"]
173
+ }
174
+ },
175
+ "references": {
176
+ "type": "array",
177
+ "items": {
178
+ "type": "string",
179
+ "format": "uri"
180
+ },
181
+ "title": "References",
182
+ "minItems": 1,
183
+ "maxItems": 5,
184
+ "uniqueItems": true,
185
+ "x-markform": {
186
+ "role": "user",
187
+ "group": "url_fields",
188
+ "placeholder": "https://docs.example.com",
189
+ "examples": ["https://wikipedia.org/wiki/Example", "https://docs.github.com/en"]
190
+ }
191
+ },
192
+ "event_date": {
193
+ "type": "string",
194
+ "format": "date",
195
+ "title": "Event Date",
196
+ "formatMinimum": "2020-01-01",
197
+ "formatMaximum": "2030-12-31",
198
+ "x-markform": {
199
+ "role": "user",
200
+ "group": "date_fields",
201
+ "minDate": "2020-01-01",
202
+ "maxDate": "2030-12-31"
203
+ }
204
+ },
205
+ "founded_year": {
206
+ "type": "integer",
207
+ "title": "Founded Year",
208
+ "minimum": 1900,
209
+ "maximum": 2030,
210
+ "x-markform": {
211
+ "role": "user",
212
+ "group": "date_fields"
213
+ }
214
+ },
215
+ "team_members": {
216
+ "type": "array",
217
+ "items": {
218
+ "type": "object",
219
+ "properties": {
220
+ "name": {
221
+ "title": "Name",
222
+ "type": "string"
223
+ },
224
+ "role": {
225
+ "title": "Role",
226
+ "type": "string"
227
+ },
228
+ "start_date": {
229
+ "title": "Start Date",
230
+ "type": "string",
231
+ "format": "date"
232
+ }
233
+ },
234
+ "required": ["name"]
235
+ },
236
+ "title": "Team Members",
237
+ "minItems": 0,
238
+ "maxItems": 5,
239
+ "x-markform": {
240
+ "role": "user",
241
+ "group": "table_fields"
242
+ }
243
+ },
244
+ "project_tasks": {
245
+ "type": "array",
246
+ "items": {
247
+ "type": "object",
248
+ "properties": {
249
+ "task": {
250
+ "title": "Task",
251
+ "type": "string"
252
+ },
253
+ "estimate_hrs": {
254
+ "title": "Estimate (hrs)",
255
+ "type": "number"
256
+ },
257
+ "link": {
258
+ "title": "Link",
259
+ "type": "string",
260
+ "format": "uri"
261
+ }
262
+ },
263
+ "required": ["task"]
264
+ },
265
+ "title": "Project Tasks",
266
+ "minItems": 0,
267
+ "maxItems": 10,
268
+ "x-markform": {
269
+ "role": "user",
270
+ "group": "table_fields"
271
+ }
272
+ },
273
+ "notes": {
274
+ "type": "string",
275
+ "title": "Notes",
276
+ "x-markform": {
277
+ "role": "user",
278
+ "group": "optional_fields"
279
+ }
280
+ },
281
+ "optional_number": {
282
+ "type": "number",
283
+ "title": "Optional Number",
284
+ "x-markform": {
285
+ "role": "user",
286
+ "group": "optional_fields"
287
+ }
288
+ },
289
+ "related_url": {
290
+ "type": "string",
291
+ "format": "uri",
292
+ "title": "Related URL",
293
+ "x-markform": {
294
+ "role": "user",
295
+ "group": "optional_fields"
296
+ }
297
+ },
298
+ "optional_date": {
299
+ "type": "string",
300
+ "format": "date",
301
+ "title": "Optional Date",
302
+ "x-markform": {
303
+ "role": "user",
304
+ "group": "optional_fields"
305
+ }
306
+ },
307
+ "optional_year": {
308
+ "type": "integer",
309
+ "title": "Optional Year",
310
+ "x-markform": {
311
+ "role": "user",
312
+ "group": "optional_fields"
313
+ }
314
+ }
315
+ },
316
+ "title": "Simple Test Form",
317
+ "description": "A fully interactive form demonstrating all Markform v0.1 field types.\nFill all fields using interactive prompts - no LLM API key needed.",
318
+ "required": [
319
+ "name",
320
+ "email",
321
+ "age",
322
+ "tags",
323
+ "priority",
324
+ "categories",
325
+ "tasks_multi",
326
+ "tasks_simple",
327
+ "confirmations",
328
+ "website",
329
+ "event_date",
330
+ "founded_year"
331
+ ],
332
+ "x-markform": {
333
+ "spec": "MF/0.1",
334
+ "roles": ["user", "agent"],
335
+ "roleInstructions": {
336
+ "user": "Fill in the fields you have direct knowledge of.",
337
+ "agent": "Complete the remaining fields based on the provided context."
338
+ },
339
+ "groups": [
340
+ {
341
+ "id": "basic_fields",
342
+ "title": "Basic Fields"
343
+ },
344
+ {
345
+ "id": "list_fields",
346
+ "title": "List Fields"
347
+ },
348
+ {
349
+ "id": "selection_fields",
350
+ "title": "Selection Fields"
351
+ },
352
+ {
353
+ "id": "checkbox_fields",
354
+ "title": "Checkbox Fields"
355
+ },
356
+ {
357
+ "id": "url_fields",
358
+ "title": "URL Fields"
359
+ },
360
+ {
361
+ "id": "date_fields",
362
+ "title": "Date and Year Fields"
363
+ },
364
+ {
365
+ "id": "table_fields",
366
+ "title": "Table Fields"
367
+ },
368
+ {
369
+ "id": "optional_fields",
370
+ "title": "Optional Fields"
371
+ }
372
+ ]
373
+ }
374
+ }