devlyn-cli 4.3.21 → 4.3.23

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 (49) hide show
  1. package/AGENTS.md +1 -1
  2. package/CLAUDE.md +1 -1
  3. package/README.md +1 -1
  4. package/bin/devlyn.js +26 -1
  5. package/bin/instruction-templates.json +26 -0
  6. package/bin/skill-history.json +12 -1
  7. package/config/skills/_shared/bring-in.py +810 -0
  8. package/config/skills/_shared/harness-store.py +18 -6
  9. package/config/skills/_shared/runtime-principles.md +1 -1
  10. package/config/skills/_shared/storage-checkout.py +117 -0
  11. package/config/skills/_shared/storage-client.py +1180 -0
  12. package/config/skills/_shared/task-complete.py +900 -88
  13. package/config/skills/_shared/task-completion.md +78 -6
  14. package/config/skills/_shared/warm-build-dirs.py +53 -3
  15. package/config/skills/devlyn-ideate/SKILL.md +1 -1
  16. package/config/skills/devlyn-ideate/references/loop.md +2 -2
  17. package/config/skills/devlyn-ideate/scripts/queue.py +69 -18
  18. package/config/storage-client-contract.json +7 -0
  19. package/harness/AGENTS.md +2 -2
  20. package/harness/CLAUDE.md +2 -2
  21. package/native/claude/.claude-plugin/plugin.json +1 -1
  22. package/native/claude/skills/_shared/bring-in.py +810 -0
  23. package/native/claude/skills/_shared/harness-store.py +18 -6
  24. package/native/claude/skills/_shared/runtime-principles.md +1 -1
  25. package/native/claude/skills/_shared/storage-checkout.py +117 -0
  26. package/native/claude/skills/_shared/storage-client.py +1180 -0
  27. package/native/claude/skills/_shared/task-complete.py +900 -88
  28. package/native/claude/skills/_shared/task-completion.md +78 -6
  29. package/native/claude/skills/_shared/warm-build-dirs.py +53 -3
  30. package/native/claude/skills/devlyn-ideate/SKILL.md +1 -1
  31. package/native/claude/skills/devlyn-ideate/references/loop.md +2 -2
  32. package/native/claude/skills/devlyn-ideate/scripts/queue.py +69 -18
  33. package/native/codex/.agents/plugins/marketplace.json +1 -1
  34. package/native/codex/plugins/devlyn/.codex-plugin/plugin.json +1 -1
  35. package/native/codex/plugins/devlyn/skills/_shared/bring-in.py +810 -0
  36. package/native/codex/plugins/devlyn/skills/_shared/harness-store.py +18 -6
  37. package/native/codex/plugins/devlyn/skills/_shared/runtime-principles.md +1 -1
  38. package/native/codex/plugins/devlyn/skills/_shared/storage-checkout.py +117 -0
  39. package/native/codex/plugins/devlyn/skills/_shared/storage-client.py +1180 -0
  40. package/native/codex/plugins/devlyn/skills/_shared/task-complete.py +900 -88
  41. package/native/codex/plugins/devlyn/skills/_shared/task-completion.md +78 -6
  42. package/native/codex/plugins/devlyn/skills/_shared/warm-build-dirs.py +53 -3
  43. package/native/codex/plugins/devlyn/skills/devlyn-ideate/SKILL.md +1 -1
  44. package/native/codex/plugins/devlyn/skills/devlyn-ideate/references/loop.md +2 -2
  45. package/native/codex/plugins/devlyn/skills/devlyn-ideate/scripts/queue.py +69 -18
  46. package/optional-skills/better-auth-setup/SKILL.md +9 -3
  47. package/optional-skills/better-auth-setup/references/proxy-setup.md +10 -3
  48. package/package.json +1 -1
  49. package/release.json +91 -41
package/AGENTS.md CHANGED
@@ -13,7 +13,7 @@ Seven rules govern every change. Cite them by name when a decision touches one.
13
13
  1. **No workaround** — fix the root cause, never the symptom. No `any`, no `@ts-ignore`, no silent `catch`, no hardcoded fallback that hides a broken contract. No config bypasses.
14
14
  2. **No overengineering** — smallest sufficient change, one responsibility per module. New abstractions need an observed failure. Subtractive-first: ask "what can I delete instead?" before writing anything new. Remove code your change makes unused; only report unrelated pre-existing dead code.
15
15
  3. **No guesswork** — verify with the actual files, logs, diffs, and run output before forming conclusions. State the falsifiable prediction BEFORE the experiment; record raw results AFTER. Retroactive prediction edits are dishonest.
16
- 4. **Worldclass** — code that survives review at a non-trivial codebase. Zero CRITICAL, zero HIGH security/design findings on the shippable path.
16
+ 4. **Worldclass** — zero CRITICAL, zero HIGH security/design findings on the shippable path. Any review is one pass in which every reviewer, including each one the user requires, reads the source the checks ran on; fix each finding or reject it with a reason, re-check the fixes and the invariants they touch, and repeat the full review only while a CRITICAL or HIGH finding remains.
17
17
  5. **Best practice** — idiomatic for the language and framework. Use standard primitives; do not hand-roll what the library already provides.
18
18
  6. **Optimized** — use efficient code and avoid unnecessary work without sacrificing correctness or the user's requirements.
19
19
  7. **Production ready** — error states are explicit and visible; behavior under failure is what the user expects, not silent corruption.
package/CLAUDE.md CHANGED
@@ -13,7 +13,7 @@ Seven rules govern every change. Cite them by name when a decision touches one.
13
13
  1. **No workaround** — fix the root cause, never the symptom. No `any`, no `@ts-ignore`, no silent `catch`, no hardcoded fallback that hides a broken contract. No config bypasses.
14
14
  2. **No overengineering** — smallest sufficient change, one responsibility per module. New abstractions need an observed failure. Subtractive-first: ask "what can I delete instead?" before writing anything new. Remove code your change makes unused; only report unrelated pre-existing dead code.
15
15
  3. **No guesswork** — verify with the actual files, logs, diffs, and run output before forming conclusions. State the falsifiable prediction BEFORE the experiment; record raw results AFTER. Retroactive prediction edits are dishonest.
16
- 4. **Worldclass** — code that survives review at a non-trivial codebase. Zero CRITICAL, zero HIGH security/design findings on the shippable path.
16
+ 4. **Worldclass** — zero CRITICAL, zero HIGH security/design findings on the shippable path. Any review is one pass in which every reviewer, including each one the user requires, reads the source the checks ran on; fix each finding or reject it with a reason, re-check the fixes and the invariants they touch, and repeat the full review only while a CRITICAL or HIGH finding remains.
17
17
  5. **Best practice** — idiomatic for the language and framework. Use standard primitives; do not hand-roll what the library already provides.
18
18
  6. **Optimized** — use efficient code and avoid unnecessary work without sacrificing correctness or the user's requirements.
19
19
  7. **Production ready** — error states are explicit and visible; behavior under failure is what the user expects, not silent corruption.
package/README.md CHANGED
@@ -62,7 +62,7 @@ Give ideate an intent or a document. It writes a loop package — a meta-prompt
62
62
  | `/devlyn-ideate status` | Pending, active, accepted and failed counts; the next runnable task; delivery and recovery blockers. |
63
63
  | `/devlyn-ideate drain` | Runs the queue serially and hands-free. |
64
64
 
65
- A bare intent is planned and, when your request authorizes the work, added and drained without another confirmation; no arguments shows status. Questions come only when the answer changes behavior, scope, data semantics, acceptance or delivery, each with a recommended answer; `--autonomous` plans without questions, recording ordinary low-consequence, reversible defaults within the request, including user-visible details; material ambiguity in intended outcomes, persistent data or state semantics, or public surface beyond the request stops planning with a concrete question. Each task runs in its own worktree with the executor pinned by `/devlyn-engines` (default: the CLI you opened; Pi and Grok need a pin) under your installed CLAUDE.md/AGENTS.md instructions. Tasks start from committed state, the branch you added the loop on or the remote base for `auto`/`pr`, so a task's worktree holds only what is committed there. A task would run without installed CLAUDE.md/AGENTS.md that exist only in this checkout, so add stops while they differ from HEAD, and drain waits while they differ from the task's start commit. It is marked `[x]` only when its declared checks pass on its committed source and its required reviews cover it: the checks run through the drain's runner (a wholly clean run the executor lists for that source is reused; the drain runs any other check itself), and review coverage is attested by records the executor submits; a failed task becomes `[F]` with its reason and blocks only its dependents. An interrupted drain resumes without repeating accepted work. `--local-only` (or `--no-push`) keeps delivery local: each accepted task stays on its `devlyn/<loop-id>/<task-id>` branch in a retained worktree, nothing is merged or pushed, and the drain report's `Bring into` command is `git merge --ff <latest accepted task branch>`.
65
+ A bare intent is planned and, when your request authorizes the work, added and drained without another confirmation; no arguments shows status. Questions come only when the answer changes behavior, scope, data semantics, acceptance or delivery, each with a recommended answer; `--autonomous` plans without questions, recording ordinary low-consequence, reversible defaults within the request, including user-visible details; material ambiguity in intended outcomes, persistent data or state semantics, or public surface beyond the request stops planning with a concrete question. Each task runs in its own worktree with the executor pinned by `/devlyn-engines` (default: the CLI you opened; Pi and Grok need a pin) under your installed CLAUDE.md/AGENTS.md instructions. Tasks start from committed state, the branch you added the loop on or the remote base for `auto`/`pr`, so a task's worktree holds only what is committed there. A task would run without installed CLAUDE.md/AGENTS.md that exist only in this checkout, so add stops while they differ from HEAD, and drain waits while they differ from the task's start commit. It is marked `[x]` only when its declared checks pass on its committed source and its required reviews cover it: the checks run through the drain's runner (a wholly clean run the executor lists for that source is reused; the drain runs any other check itself), and review coverage is attested by records the executor submits; a failed task becomes `[F]` with its reason and blocks only its dependents. An interrupted drain resumes without repeating accepted work. `--local-only` (or `--no-push`) keeps delivery local: each accepted task stays on its `devlyn/<loop-id>/<task-id>` branch in a retained worktree, nothing is merged or pushed, and the drain report's `Bring into` command brings the result into your branch, stopping if your files cannot be preserved.
66
66
 
67
67
  ### Delivery
68
68
 
package/bin/devlyn.js CHANGED
@@ -2239,9 +2239,34 @@ function cleanupDeliver(scope, items, current) {
2239
2239
  '--remote', 'origin', '--base', scope.remote.base], scope.root).stdout);
2240
2240
  if (allocated?.status !== 'ALLOCATED') {
2241
2241
  const reason = allocated?.reason || 'allocation failed';
2242
- return { error: cleanupReason(failureCode(reason), { detail: reason }) };
2242
+ return { error: cleanupReason(failureCode(reason), { detail: reason,
2243
+ ...(allocated?.receipt ? { receipt: allocated.receipt } : {}),
2244
+ ...(allocated?.resume ? { resume: allocated.resume } : {}),
2245
+ ...(allocated?.storage_error ? { storage_error: allocated.storage_error } : {}) }) };
2243
2246
  }
2244
2247
  const release = (error = null) => {
2248
+ let receipt, managedMarker;
2249
+ try {
2250
+ receipt = JSON.parse(fs.readFileSync(allocated.receipt, 'utf8'));
2251
+ managedMarker = fs.lstatSync(path.join(path.dirname(allocated.receipt), 'storage-allocation.json'), { throwIfNoEntry: false }) !== undefined;
2252
+ }
2253
+ catch (readError) { return { error: cleanupReason('delivery-failed', { detail: readError.message, receipt: allocated.receipt }) }; }
2254
+ if (managedMarker || receipt.mode === 'managed' || ['allocation', 'allocation_state'].some((key) => String(receipt[key] || '').startsWith('managed'))) {
2255
+ // These are the cleanup's own edits and commit in its private checkout.
2256
+ // Return both index/worktree and branch before asking fenced abandonment.
2257
+ const reset = cleanupGit(worktree, ['reset', '--hard', receipt.baseline]);
2258
+ if (reset.error || reset.status !== 0) return { error: cleanupReason(error?.code || 'delivery-failed', {
2259
+ ...error?.params, detail: reset.error?.message || reset.stderr.trim(), receipt: allocated.receipt }) };
2260
+ const recovery = ['recover-storage', '--receipt', allocated.receipt,
2261
+ ...(receipt.storage?.request?.operation_id ? ['--operation-id', receipt.storage.request.operation_id] : []), '--for-removal'];
2262
+ const recovered = lastJson(run(recovery, scope.root).stdout);
2263
+ if (recovered?.status !== 'ABANDONED') return { error: cleanupReason(error?.code || 'delivery-failed', {
2264
+ ...error?.params, detail: recovered?.reason || 'managed cleanup pending', receipt: allocated.receipt,
2265
+ ...(recovered?.storage_error ? { storage_error: recovered.storage_error } : {}),
2266
+ resume: recovered?.resume || [python, '-B', helper, ...recovery]
2267
+ .map((arg) => `'${arg.replace(/'/g, "'\\''")}'`).join(' ') }) };
2268
+ return error ? { error } : {};
2269
+ }
2245
2270
  for (const args of [['worktree', 'remove', '--force', worktree], ['branch', '-D', branch]]) {
2246
2271
  const result = cleanupGit(scope.root, args);
2247
2272
  if (result.error || result.status !== 0) return { error: cleanupReason(error?.code || 'delivery-failed', { ...error?.params,
@@ -96,6 +96,18 @@
96
96
  "length": 3823,
97
97
  "sha256": "372d8fcee5f2498bcf282ebd3b3ba74d2ccf317019406193317275864d1f78a2"
98
98
  }
99
+ },
100
+ {
101
+ "versions": [
102
+ "4.3.21"
103
+ ],
104
+ "length": 4018,
105
+ "sha256": "7d559f330bb426022b8166e0a0cbb77d25ca8d204d3ca6c1f4fbcb18c3963626",
106
+ "preamble": "# Project Instructions\n\ndevlyn-cli installs the `devlyn-ideate` and `devlyn-engines` skills alongside the principles below, which are non-negotiable on every change \u2014 yours and any sub-agent's.\n\n",
107
+ "body": {
108
+ "length": 3823,
109
+ "sha256": "b8afbb73fb27c01544b411c90242bdfcfaf2537907a943270540cbcdfe2bf148"
110
+ }
99
111
  }
100
112
  ],
101
113
  "CLAUDE.md": [
@@ -195,6 +207,18 @@
195
207
  "length": 3823,
196
208
  "sha256": "372d8fcee5f2498bcf282ebd3b3ba74d2ccf317019406193317275864d1f78a2"
197
209
  }
210
+ },
211
+ {
212
+ "versions": [
213
+ "4.3.21"
214
+ ],
215
+ "length": 4018,
216
+ "sha256": "7d559f330bb426022b8166e0a0cbb77d25ca8d204d3ca6c1f4fbcb18c3963626",
217
+ "preamble": "# Project Instructions\n\ndevlyn-cli installs the `devlyn-ideate` and `devlyn-engines` skills alongside the principles below, which are non-negotiable on every change \u2014 yours and any sub-agent's.\n\n",
218
+ "body": {
219
+ "length": 3823,
220
+ "sha256": "b8afbb73fb27c01544b411c90242bdfcfaf2537907a943270540cbcdfe2bf148"
221
+ }
198
222
  }
199
223
  ],
200
224
  "paragraphs": {
@@ -330,6 +354,7 @@
330
354
  "5e329ef8e25962ef0c9b29cf769fa1a92a82ab597ef29118961ff250eee76f70",
331
355
  "5e73319288935d1857bf1d9b8a46f56c19bdffd46ff2f822b930f2b17cb1f98d",
332
356
  "5eaedae1a36f29150537ca51771c3ed19afadc72e08a304179c52454252ad312",
357
+ "5f641238add8c0124994452bd9f814412111f23b53355af6b736940b151e2aae",
333
358
  "5ffc38dcb6fdccd02c03d67777b3a45ffc131883b61ce604dc8c9d74394dd739",
334
359
  "601518dee731c1966283001440827f4250beccc82bfb573d596e04eac45c1918",
335
360
  "6152799d5f13bb10d474f2498c0b5258da2ee5197819b67ff87716183711a59b",
@@ -773,6 +798,7 @@
773
798
  "5e73319288935d1857bf1d9b8a46f56c19bdffd46ff2f822b930f2b17cb1f98d",
774
799
  "5e911fbf2ddc2fafa3a62a42b66036bf9a70c52eab36207678e2a90f13bd157d",
775
800
  "5f38703141243c57ce3bd616331b1c6d02b774a9559d1cf6854f92731b1561ca",
801
+ "5f641238add8c0124994452bd9f814412111f23b53355af6b736940b151e2aae",
776
802
  "5fc4015eaff44f45d38070d5c55f8ab3aa99397e02a9451255d3a3565e1f0c77",
777
803
  "60a9d5e21a3bf0bb16a04b9680905fd8d3e9332b883f10aae48c00155086206a",
778
804
  "6170d780ab4f3cb5e2ea7d2757f9239d35dbbc1f9398e73877a95d5ef4c582ee",
@@ -69,6 +69,7 @@
69
69
  "58af082042ac1cec7fb60dd2b6287e714db2684edeea5f96112716464f583742",
70
70
  "5995fcdb203a6b98c3e7cae4fe6cc7a3fb57f06a5d32069576e58350d50eab6f",
71
71
  "59f0ecc2c1fd9620e4cac06be370e0bf9965a35c20616047445dbc42da6a1677",
72
+ "5b8541a98c06de50443c2c3905c1b92ba143a972dfe618c4b296b799e0e1673c",
72
73
  "5be2e643f96b6ce503ae8d631c67729f0c24b6c5d2b431c087161b520ccbe417",
73
74
  "60cdd1a8b220e629bcba3a24652323d16e3e6a15ba5b07c69ef2785a9c2eca70",
74
75
  "61ec4c0435a2f0b307df8e88d81d9862c3abc1bf758648f2c18039581596659b",
@@ -119,6 +120,7 @@
119
120
  "9815b6e6963e068872a6dbeae24068143bf92042bb035f67bafd1a224d65bcb0",
120
121
  "998343c148618b937556b58b83749c05d5aa3283280d751c118da6a542fb87f2",
121
122
  "9dd3ec225818efe0ad3726192db94ff129154e995617a9d3c150fc58ad0f9f2c",
123
+ "9e4d06fd466fa896040109bac0018fcfb2f1604d55abb4180ff1f1a0b665bbc8",
122
124
  "9f14ca629e41730b1a9fb5d0ad1a39cff558fe34758d6ceccbb9de498f9f384e",
123
125
  "a11950a5880346f03257c688fd8bc6f8c29fc0b7c05c90e8f5211d5fb7665774",
124
126
  "a405a99b988f6edd2eabb0504b36309bb4cf0c3b97eab26bb7ef257e4515dbf3",
@@ -137,9 +139,11 @@
137
139
  "afd8966f25b601b4f6a915fa2c6591b7369f55e8a9ae370cdcb98caf886de707",
138
140
  "b1fced67f40768df688e8ce34d3105dafaf6027d3e4522b77276d168bf150f32",
139
141
  "b27e98e1872f450aa11c85d6aebd70d25cb5d45db13662b7ce57a1ab1736b348",
142
+ "b382de815165e3d23bf95206e73b496b790f2b17dd4dca91a9038311032b9647",
140
143
  "b3ba619b28a26cb71e2d1fd45adb203cca2b0917acd44288bb1dadf300859259",
141
144
  "b4414c6811d824ba16084bc1dda9b956d04055fd4ec4467e62d2d27f364389a0",
142
145
  "b6b5b1952f7d2daa15af39858bb05dda9b5f55dc15c479f8fa7ca84a0ad5299e",
146
+ "ba2895753d926f3d8ebcb800299ec2853932620f9374a18b6c833aa33e8731bd",
143
147
  "ba64bf037553aafdfb6de721fff73f32ae6b0e6fc1fb54d857d347bf3e9b8952",
144
148
  "bb967300f6fdee8b8461ff2a5f82acd055d969dc6cdc1040cc36a39867cad6e6",
145
149
  "bf553a8028b16a662916922ef1017d9d8d09dac487134252f2871776e5166ce2",
@@ -184,6 +188,7 @@
184
188
  "f958bfabd2e056fea911526fba2196d2ed5a48828f576e5ce1657100b466db20",
185
189
  "f9617e1034543f31ae2a3820301fbac6e4674e5d6fbc0d4b76751fe87b8e013e",
186
190
  "fd68c7a74272929a14e685e447a51058ffcdd4c1d6bef83cbba18045c07aee55",
191
+ "fdb608b34a8600b4ce209d7f645ec5ad4475948be6ad95c941cc7ef02b5959df",
187
192
  "fe386122e502410394ab60643e79aa736ddb5030257c863f4a198e23b56b4cef",
188
193
  "feaa255b2b6a7b0dc79877c4eb620c0f3cac88b50d2d1407a0a8a02ebc08ed49"
189
194
  ],
@@ -193,7 +198,8 @@
193
198
  "better-auth-setup": [
194
199
  "4cdc8e524f4caa806ac6899c4259cd7dfb872d0ba2226159024938607e1ce85b",
195
200
  "ca927c5078ef5f6ef145a8a11203bec33e57d71d130befeb5b65ad13f4138b6f",
196
- "e97c39c5d669ffc1f49d57fd3a016e852727e57c3abe2f9be1ebffab9fcb19ec"
201
+ "e97c39c5d669ffc1f49d57fd3a016e852727e57c3abe2f9be1ebffab9fcb19ec",
202
+ "eaf93cc4f0fa83d53cc4228f272229a5564411cf5258787f111efe3c76cf8f6a"
197
203
  ],
198
204
  "cloudflare-nextjs-setup": [
199
205
  "f147a28b9f6f62feb21df89bdf08869820f4871ede7a8ba4a242246509ee6e35"
@@ -335,6 +341,7 @@
335
341
  "0dc69c20434966015176d83baa6f95b3421f9e13d0b1bd608a22f0560eae1049",
336
342
  "0fe9b270d670f70da9d2535969b6117684b7c1517806b3029ebaf9624da8006c",
337
343
  "1582c202d361af927c2d0843d4bcb72ccc98a0a2a9d8344d118d680f70f7e1e4",
344
+ "15f3eca3fad92b199814a00d42e4005a2838a40d800b9f755f7165d31773e7c9",
338
345
  "19207315f23c9a12bf2ced0e4e79bb7dfdc7cc5d0c9dd94095d9c6dfe1e8fea8",
339
346
  "1d8c3bd31c8b755acd0c3c9f416acb5024dfa99fbf5e2c14d8d6df00a24fe9b4",
340
347
  "300d1af60cc53285935dc4b5b370e157707218d844a4303b96d7826eef36ed43",
@@ -342,6 +349,7 @@
342
349
  "33cf196ba7dd2d96df119707d874317e6005f1323fc2cae677c53e2f134f9ff4",
343
350
  "36b58dbdc26e51abc05a60872c4582faeebd67e9fe5626a3933467ba07c68dc4",
344
351
  "40237cd5259dbcf7c490f130e844a9e32eea48a8edabd50800edee5029bf95a4",
352
+ "4213143689f7e7fe62ab8743c256a45492fafffc1757d64901b7b02725aee5c3",
345
353
  "49d6e024b343dd77e4c0cea0e513e40fe679a7a8192953190d042b3a21bbf69c",
346
354
  "5536f8391ec4442f1b793dba8dd5d7820d45f4b6dadf1111cbac9d54469a01ca",
347
355
  "573a6059a7383b37affd9c2e8bc6c88a4fb54117628a5a0746406cc32111e9aa",
@@ -380,6 +388,7 @@
380
388
  "e25da746dc37b2e82c658a28d9481fd69741151045683eee2119582ddaf731cd",
381
389
  "e47a2ce766ae81fa0870e0a8dfbfe737311de69ce620e92217abbe4c532e3c8b",
382
390
  "e929f76c15349f1b9bc1e84e0a3e9e48e916168d79270e0f4a36ea8eab9b5388",
391
+ "ebc693658da0b260c876f29cd6dfc2b12ae6690e3532622fa9c1cd4481162bd8",
383
392
  "f2243cc4150e225961825f6097b0cf38166c291dcf58127516ceee841f7ed4c8",
384
393
  "fa536198d539a3c85f54dda74d0d78716ac6e6849e733bdadecc8605511eac37",
385
394
  "fffa5a47a414c9eae607aeacb6f1a35c5dd5a7f9d1f8532cccf275c79b80775c"
@@ -789,6 +798,8 @@
789
798
  "4.3.2",
790
799
  "4.3.20",
791
800
  "4.3.21",
801
+ "4.3.22",
802
+ "4.3.23",
792
803
  "4.3.3",
793
804
  "4.3.4",
794
805
  "4.3.5",