jazari 0.7.0 → 0.8.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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "schema": "jazari-conformance/v1",
3
+ "recipes": [{"id":"fixture.v1","topic":"Fixture","checklist":[{"id":"first","text":"First"}]}],
4
+ "steps": [
5
+ {"request":{"protocol":"jazari/v1","request_id":"resolve","action":"get","target":{"kind":"queue","key":"fixture","recipe_id":"fixture.v1"},"arguments":{}},"expect":{"ok":true,"result":{"state":"default","topic":"Fixture","progress":{"done":0,"total":1,"percent":0}}}}
6
+ ]
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "schema": "jazari-conformance/v1",
3
+ "recipes": [{"id":"fixture.v1","topic":"Fixture","checklist":[{"id":"first","text":"First"}]}],
4
+ "steps": [
5
+ {"request":{"protocol":"jazari/v1","request_id":"stale","action":"set","target":{"kind":"anchor","scope_type":"local","scope_id":1,"key":"one","recipe_id":"fixture.v1"},"arguments":{"expected_revision":"default:stale","topic":"Changed","description":"","checklist":[]}},"expect":{"ok":false,"error":{"code":"revision_conflict"}}}
6
+ ]
7
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "schema": "jazari-conformance/v1",
3
+ "recipes": [{"id":"closed.v1","topic":"Closed","checklist":[{"id":"first","text":"First"}]}],
4
+ "steps": [
5
+ {"request":{"protocol":"jazari/v1","request_id":"open","action":"start","target":{"kind":"queue","key":"closed","recipe_id":"closed.v1"},"arguments":{"actor_ref":"agent:fixture"}},"expect":{"ok":true}},
6
+ {"request":{"protocol":"jazari/v1","request_id":"finish","action":"finish","target":{"kind":"queue","key":"closed","recipe_id":"closed.v1"},"arguments":{"run_id":"$0.result.run_id","expected_revision":"$0.result.revision","outcome":"completed"}},"expect":{"ok":true,"result":{"open":false,"outcome":"completed"}}},
7
+ {"request":{"protocol":"jazari/v1","request_id":"late","action":"tick","target":{"kind":"queue","key":"closed","recipe_id":"closed.v1"},"arguments":{"run_id":"$0.result.run_id","expected_revision":"$1.result.revision","item_id":"first","done":true}},"expect":{"ok":false,"error":{"code":"run_closed"}}}
8
+ ]
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "schema": "jazari-conformance/v1",
3
+ "recipes": [{"id":"snapshot.v1","topic":"Snapshot","checklist":[{"id":"first","text":"First"}]}],
4
+ "steps": [
5
+ {"request":{"protocol":"jazari/v1","request_id":"open","action":"start","target":{"kind":"queue","key":"snapshot","recipe_id":"snapshot.v1"},"arguments":{"actor_ref":"agent:fixture"}},"expect":{"ok":true}},
6
+ {"setup":{"replace_recipe":{"id":"snapshot.v1","topic":"Changed","checklist":[{"id":"later","text":"Later"}]} }},
7
+ {"request":{"protocol":"jazari/v1","request_id":"tick","action":"tick","target":{"kind":"queue","key":"snapshot","recipe_id":"snapshot.v1"},"arguments":{"run_id":"$0.result.run_id","expected_revision":"$0.result.revision","item_id":"first","done":true}},"expect":{"ok":true,"result":{"ticks":[{"id":"first","done":true,"actor_ref":"agent:fixture"}]}}}
8
+ ]
9
+ }
@@ -0,0 +1,215 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/nauman/jazari/protocol/v1/request.schema.json",
4
+ "title": "Jazari v1 request",
5
+ "$defs": {
6
+ "requestId": { "type": "string", "minLength": 1 },
7
+ "revision": { "type": "string", "minLength": 1 },
8
+ "checklistItem": {
9
+ "type": "object",
10
+ "required": ["text"],
11
+ "properties": {
12
+ "id": { "type": "string", "pattern": "^[A-Za-z0-9_-]{1,64}$" },
13
+ "text": { "type": "string", "minLength": 1, "maxLength": 500 },
14
+ "done": { "type": "boolean" },
15
+ "required": { "type": "boolean" }
16
+ },
17
+ "additionalProperties": false
18
+ },
19
+ "target": {
20
+ "oneOf": [
21
+ {
22
+ "type": "object",
23
+ "required": ["kind", "key", "recipe_id"],
24
+ "properties": {
25
+ "kind": { "const": "queue" },
26
+ "key": { "type": "string", "minLength": 1 },
27
+ "recipe_id": { "type": "string", "minLength": 1 },
28
+ "public_reference": { "type": "object" }
29
+ },
30
+ "additionalProperties": false
31
+ },
32
+ {
33
+ "type": "object",
34
+ "required": ["kind", "scope_type", "scope_id", "key", "recipe_id"],
35
+ "properties": {
36
+ "kind": { "const": "anchor" },
37
+ "scope_type": { "type": "string", "minLength": 1 },
38
+ "scope_id": { "type": "integer" },
39
+ "key": { "type": "string", "minLength": 1 },
40
+ "recipe_id": { "type": "string", "minLength": 1 },
41
+ "public_reference": { "type": "object" }
42
+ },
43
+ "additionalProperties": false
44
+ }
45
+ ]
46
+ }
47
+ },
48
+ "type": "object",
49
+ "required": ["protocol", "request_id", "action", "arguments"],
50
+ "properties": {
51
+ "protocol": { "const": "jazari/v1" },
52
+ "request_id": { "$ref": "#/$defs/requestId" },
53
+ "action": { "type": "string" },
54
+ "target": { "$ref": "#/$defs/target" },
55
+ "arguments": { "type": "object" }
56
+ },
57
+ "additionalProperties": false,
58
+ "oneOf": [
59
+ {
60
+ "properties": {
61
+ "action": { "const": "capabilities" },
62
+ "arguments": { "type": "object", "maxProperties": 0, "additionalProperties": false }
63
+ },
64
+ "not": { "required": ["target"] }
65
+ },
66
+ {
67
+ "required": ["target"],
68
+ "properties": {
69
+ "action": { "enum": ["get", "last_run"] },
70
+ "arguments": { "type": "object", "maxProperties": 0, "additionalProperties": false }
71
+ }
72
+ },
73
+ {
74
+ "required": ["target"],
75
+ "properties": {
76
+ "action": { "const": "set" },
77
+ "arguments": {
78
+ "type": "object",
79
+ "required": ["expected_revision", "topic", "checklist"],
80
+ "properties": {
81
+ "expected_revision": { "$ref": "#/$defs/revision" },
82
+ "topic": { "type": "string", "minLength": 1, "maxLength": 120 },
83
+ "description": { "type": "string", "maxLength": 20000 },
84
+ "checklist": {
85
+ "type": "array",
86
+ "items": { "$ref": "#/$defs/checklistItem" },
87
+ "description": "The normalized stored checklist must be at most 65536 bytes."
88
+ }
89
+ },
90
+ "additionalProperties": false
91
+ }
92
+ }
93
+ },
94
+ {
95
+ "required": ["target"],
96
+ "properties": {
97
+ "action": { "const": "add_item" },
98
+ "arguments": {
99
+ "type": "object", "required": ["expected_revision", "text"],
100
+ "properties": {
101
+ "expected_revision": { "$ref": "#/$defs/revision" },
102
+ "text": { "type": "string", "minLength": 1, "maxLength": 500 },
103
+ "required": { "type": "boolean" }
104
+ },
105
+ "additionalProperties": false
106
+ }
107
+ }
108
+ },
109
+ {
110
+ "required": ["target"],
111
+ "properties": {
112
+ "action": { "const": "remove_item" },
113
+ "arguments": {
114
+ "type": "object", "required": ["expected_revision", "item_id"],
115
+ "properties": {
116
+ "expected_revision": { "$ref": "#/$defs/revision" },
117
+ "item_id": { "type": "string", "minLength": 1 }
118
+ },
119
+ "additionalProperties": false
120
+ }
121
+ }
122
+ },
123
+ {
124
+ "required": ["target"],
125
+ "properties": {
126
+ "action": { "const": "check_item" },
127
+ "arguments": {
128
+ "type": "object", "required": ["expected_revision", "item_id", "done"],
129
+ "properties": {
130
+ "expected_revision": { "$ref": "#/$defs/revision" },
131
+ "item_id": { "type": "string", "minLength": 1 },
132
+ "done": { "type": "boolean" }
133
+ },
134
+ "additionalProperties": false
135
+ }
136
+ }
137
+ },
138
+ {
139
+ "required": ["target"],
140
+ "properties": {
141
+ "action": { "const": "reset" },
142
+ "arguments": {
143
+ "type": "object", "required": ["expected_revision", "confirm"],
144
+ "properties": {
145
+ "expected_revision": { "$ref": "#/$defs/revision" },
146
+ "confirm": { "type": "boolean", "const": true }
147
+ },
148
+ "additionalProperties": false
149
+ }
150
+ }
151
+ },
152
+ {
153
+ "required": ["target"],
154
+ "properties": {
155
+ "action": { "const": "start" },
156
+ "arguments": {
157
+ "type": "object", "required": ["actor_ref"],
158
+ "properties": { "actor_ref": { "type": "string", "minLength": 1 } },
159
+ "additionalProperties": false
160
+ }
161
+ }
162
+ },
163
+ {
164
+ "required": ["target"],
165
+ "properties": {
166
+ "action": { "const": "tick" },
167
+ "arguments": {
168
+ "type": "object", "required": ["run_id", "expected_revision", "item_id", "done"],
169
+ "properties": {
170
+ "run_id": { "type": "integer", "minimum": 1 },
171
+ "expected_revision": { "$ref": "#/$defs/revision" },
172
+ "item_id": { "type": "string", "minLength": 1 },
173
+ "done": { "type": "boolean" },
174
+ "actor_ref": { "type": "string", "minLength": 1 },
175
+ "note": { "type": "string", "maxLength": 500 }
176
+ },
177
+ "additionalProperties": false
178
+ }
179
+ }
180
+ },
181
+ {
182
+ "required": ["target"],
183
+ "properties": {
184
+ "action": { "const": "evidence" },
185
+ "arguments": {
186
+ "type": "object", "required": ["run_id", "expected_revision", "kind", "value"],
187
+ "properties": {
188
+ "run_id": { "type": "integer", "minimum": 1 },
189
+ "expected_revision": { "$ref": "#/$defs/revision" },
190
+ "item_id": { "type": "string", "minLength": 1 },
191
+ "kind": { "enum": ["output", "url", "sha", "count", "note"] },
192
+ "value": { "type": "string", "maxLength": 2000 },
193
+ "actor_ref": { "type": "string", "minLength": 1 }
194
+ },
195
+ "additionalProperties": false
196
+ }
197
+ }
198
+ },
199
+ {
200
+ "required": ["target"],
201
+ "properties": {
202
+ "action": { "const": "finish" },
203
+ "arguments": {
204
+ "type": "object", "required": ["run_id", "expected_revision", "outcome"],
205
+ "properties": {
206
+ "run_id": { "type": "integer", "minimum": 1 },
207
+ "expected_revision": { "$ref": "#/$defs/revision" },
208
+ "outcome": { "enum": ["completed", "abandoned", "failed"] }
209
+ },
210
+ "additionalProperties": false
211
+ }
212
+ }
213
+ }
214
+ ]
215
+ }
@@ -0,0 +1,124 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/nauman/jazari/protocol/v1/response.schema.json",
4
+ "title": "Jazari v1 response",
5
+ "$defs": {
6
+ "checklistItem": {
7
+ "type": "object",
8
+ "required": ["id", "text", "done", "required"],
9
+ "properties": {
10
+ "id": { "type": "string" }, "text": { "type": "string" },
11
+ "done": { "type": "boolean" }, "required": { "type": "boolean" },
12
+ "post_snapshot": { "type": "boolean" }
13
+ },
14
+ "additionalProperties": false
15
+ },
16
+ "lastRun": {
17
+ "type": ["object", "null"],
18
+ "properties": {
19
+ "id": { "type": "integer" },
20
+ "outcome": { "type": ["string", "null"] },
21
+ "started_at": { "type": "string" },
22
+ "finished_at": { "type": ["string", "null"] },
23
+ "open": { "type": "boolean" }
24
+ },
25
+ "required": ["id", "outcome", "started_at", "finished_at", "open"],
26
+ "additionalProperties": false
27
+ },
28
+ "resolved": {
29
+ "type": "object",
30
+ "required": ["state", "revision", "topic", "description", "checklist", "progress", "target_reference", "recipe", "last_run", "origin"],
31
+ "properties": {
32
+ "state": { "enum": ["default", "custom"] },
33
+ "revision": { "type": "string" },
34
+ "topic": { "type": "string" }, "description": { "type": "string" },
35
+ "checklist": { "type": "array", "items": { "$ref": "#/$defs/checklistItem" } },
36
+ "progress": {
37
+ "type": "object", "required": ["done", "total", "percent"],
38
+ "properties": { "done": { "type": "integer" }, "total": { "type": "integer" }, "percent": { "type": "integer" } },
39
+ "additionalProperties": false
40
+ },
41
+ "target_reference": { "type": "object" },
42
+ "recipe": {
43
+ "type": "object", "required": ["id", "version", "digest"],
44
+ "properties": { "id": { "type": "string" }, "version": { "type": "integer" }, "digest": { "type": "string" } },
45
+ "additionalProperties": false
46
+ },
47
+ "last_run": { "$ref": "#/$defs/lastRun" },
48
+ "origin": { "type": ["string", "null"] }
49
+ },
50
+ "additionalProperties": false
51
+ },
52
+ "run": {
53
+ "type": "object",
54
+ "required": ["run_id", "revision", "recipe", "started_at", "started_on", "finished_at", "outcome", "open", "ticks", "evidence"],
55
+ "properties": {
56
+ "run_id": { "type": "integer" }, "revision": { "type": "string" },
57
+ "recipe": { "type": "string" }, "started_at": { "type": "string" },
58
+ "started_on": { "type": "string", "format": "date" },
59
+ "finished_at": { "type": ["string", "null"] },
60
+ "outcome": { "type": ["string", "null"] }, "open": { "type": "boolean" },
61
+ "ticks": {
62
+ "type": "array",
63
+ "items": {
64
+ "type": "object", "required": ["id", "done", "at", "actor_ref", "note"],
65
+ "properties": {
66
+ "id": { "type": "string" }, "done": { "type": "boolean" },
67
+ "at": { "type": "string" }, "actor_ref": { "type": "string" },
68
+ "note": { "type": ["string", "null"] }, "post_snapshot": { "type": "boolean" }
69
+ },
70
+ "additionalProperties": false
71
+ }
72
+ },
73
+ "evidence": {
74
+ "type": "array",
75
+ "items": {
76
+ "type": "object", "required": ["item_id", "kind", "value", "at", "actor_ref"],
77
+ "properties": {
78
+ "item_id": { "type": ["string", "null"] },
79
+ "kind": { "enum": ["output", "url", "sha", "count", "note"] },
80
+ "value": { "type": "string", "maxLength": 2000 },
81
+ "at": { "type": "string" }, "actor_ref": { "type": "string" }
82
+ },
83
+ "additionalProperties": false
84
+ }
85
+ },
86
+ "created": { "type": "boolean" }, "idempotent_reuse": { "type": "boolean" }
87
+ },
88
+ "additionalProperties": false
89
+ }
90
+ },
91
+ "oneOf": [
92
+ {
93
+ "type": "object",
94
+ "required": ["protocol", "request_id", "action", "ok", "result"],
95
+ "properties": {
96
+ "protocol": { "const": "jazari/v1" }, "request_id": { "type": "string" },
97
+ "action": { "type": "string" }, "ok": { "const": true },
98
+ "result": {
99
+ "oneOf": [
100
+ { "$ref": "capability.schema.json" },
101
+ { "$ref": "#/$defs/resolved" },
102
+ { "$ref": "#/$defs/run" },
103
+ {
104
+ "type": "object", "required": ["last_run"],
105
+ "properties": { "last_run": { "type": "null" } },
106
+ "additionalProperties": false
107
+ }
108
+ ]
109
+ }
110
+ },
111
+ "additionalProperties": false
112
+ },
113
+ {
114
+ "type": "object",
115
+ "required": ["protocol", "request_id", "action", "ok", "error"],
116
+ "properties": {
117
+ "protocol": { "const": "jazari/v1" }, "request_id": { "type": "string" },
118
+ "action": { "type": "string" }, "ok": { "const": false },
119
+ "error": { "$ref": "error.schema.json" }
120
+ },
121
+ "additionalProperties": false
122
+ }
123
+ ]
124
+ }
metadata CHANGED
@@ -1,11 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jazari
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nauman Tariq
8
- bindir: bin
8
+ bindir: exe
9
9
  cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
@@ -37,12 +37,27 @@ dependencies:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
39
  version: '7.1'
40
+ - !ruby/object:Gem::Dependency
41
+ name: sqlite3
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '2.1'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '2.1'
40
54
  description: A procedure you can call instead of a document you hope someone reads.
41
55
  Recipes as data, per-subject overrides, stable queue names for rituals that outlive
42
56
  any record, and per-run evidence so "did last night's run complete?" is a query.
43
57
  email:
44
58
  - 90499+nauman@users.noreply.github.com
45
- executables: []
59
+ executables:
60
+ - jazari
46
61
  extensions: []
47
62
  extra_rdoc_files: []
48
63
  files:
@@ -54,6 +69,7 @@ files:
54
69
  - app/models/jazari/recipe_record.rb
55
70
  - app/models/jazari/run.rb
56
71
  - app/models/jazari/runbook.rb
72
+ - exe/jazari
57
73
  - lib/generators/jazari/install/install_generator.rb
58
74
  - lib/generators/jazari/install/templates/create_jazari_tables.rb
59
75
  - lib/generators/jazari/upgrade/templates/add_jazari_runbook_origin.rb
@@ -64,20 +80,36 @@ files:
64
80
  - lib/jazari/errors.rb
65
81
  - lib/jazari/mcp/actions.rb
66
82
  - lib/jazari/mcp/handler.rb
83
+ - lib/jazari/mcp/stdio_server.rb
67
84
  - lib/jazari/operations.rb
85
+ - lib/jazari/protocol/dispatcher.rb
68
86
  - lib/jazari/railtie.rb
69
87
  - lib/jazari/recipe.rb
70
88
  - lib/jazari/recipe_files.rb
71
89
  - lib/jazari/recipe_registry.rb
72
90
  - lib/jazari/resolved_runbook.rb
73
91
  - lib/jazari/runs.rb
92
+ - lib/jazari/standalone.rb
93
+ - lib/jazari/standalone/database.rb
74
94
  - lib/jazari/targets.rb
75
95
  - lib/jazari/version.rb
76
- homepage: https://github.com/nauman/jazari
96
+ - protocol/v1/capability.schema.json
97
+ - protocol/v1/error.schema.json
98
+ - protocol/v1/fixtures/actor-attribution/scenario.json
99
+ - protocol/v1/fixtures/daily-idempotency/scenario.json
100
+ - protocol/v1/fixtures/evidence/scenario.json
101
+ - protocol/v1/fixtures/operator-edit-wins/scenario.json
102
+ - protocol/v1/fixtures/resolve-default/scenario.json
103
+ - protocol/v1/fixtures/revision-conflict/scenario.json
104
+ - protocol/v1/fixtures/run-closed/scenario.json
105
+ - protocol/v1/fixtures/run-snapshot/scenario.json
106
+ - protocol/v1/request.schema.json
107
+ - protocol/v1/response.schema.json
108
+ homepage: https://nauman.github.io/jazari/
77
109
  licenses:
78
110
  - MIT
79
111
  metadata:
80
- homepage_uri: https://github.com/nauman/jazari
112
+ homepage_uri: https://nauman.github.io/jazari/
81
113
  source_code_uri: https://github.com/nauman/jazari
82
114
  changelog_uri: https://github.com/nauman/jazari/blob/main/CHANGELOG.md
83
115
  rdoc_options: []