devlyn-cli 4.3.25 → 4.3.28

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 (41) hide show
  1. package/AGENTS.md +1 -1
  2. package/CLAUDE.md +1 -1
  3. package/README.md +27 -27
  4. package/bin/devlyn.js +42 -94
  5. package/bin/harness-activation.js +4 -8
  6. package/bin/harness-context.js +395 -0
  7. package/bin/harness-run.js +148 -0
  8. package/bin/instruction-templates.json +2 -0
  9. package/bin/instructions.js +71 -159
  10. package/bin/skill-history.json +8 -0
  11. package/config/skills/_shared/runtime-principles.md +1 -1
  12. package/config/skills/_shared/storage-checkout.py +1 -0
  13. package/config/skills/_shared/storage-client.py +349 -14
  14. package/config/skills/_shared/task-complete.py +99 -24
  15. package/config/skills/_shared/task-completion.md +7 -3
  16. package/config/skills/devlyn-ideate/SKILL.md +2 -2
  17. package/config/skills/devlyn-ideate/references/loop.md +2 -2
  18. package/config/skills/devlyn-ideate/scripts/queue.py +10 -3
  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/runtime-principles.md +1 -1
  23. package/native/claude/skills/_shared/storage-checkout.py +1 -0
  24. package/native/claude/skills/_shared/storage-client.py +349 -14
  25. package/native/claude/skills/_shared/task-complete.py +99 -24
  26. package/native/claude/skills/_shared/task-completion.md +7 -3
  27. package/native/claude/skills/devlyn-ideate/SKILL.md +2 -2
  28. package/native/claude/skills/devlyn-ideate/references/loop.md +2 -2
  29. package/native/claude/skills/devlyn-ideate/scripts/queue.py +10 -3
  30. package/native/codex/.agents/plugins/marketplace.json +1 -1
  31. package/native/codex/plugins/devlyn/.codex-plugin/plugin.json +1 -1
  32. package/native/codex/plugins/devlyn/skills/_shared/runtime-principles.md +1 -1
  33. package/native/codex/plugins/devlyn/skills/_shared/storage-checkout.py +1 -0
  34. package/native/codex/plugins/devlyn/skills/_shared/storage-client.py +349 -14
  35. package/native/codex/plugins/devlyn/skills/_shared/task-complete.py +99 -24
  36. package/native/codex/plugins/devlyn/skills/_shared/task-completion.md +7 -3
  37. package/native/codex/plugins/devlyn/skills/devlyn-ideate/SKILL.md +2 -2
  38. package/native/codex/plugins/devlyn/skills/devlyn-ideate/references/loop.md +2 -2
  39. package/native/codex/plugins/devlyn/skills/devlyn-ideate/scripts/queue.py +10 -3
  40. package/package.json +2 -2
  41. package/release.json +51 -41
@@ -106,8 +106,10 @@ New allocation and warming modes come from enrollment state alone:
106
106
  | absent | present | verified `retired: true` | standalone (unenrollment complete) |
107
107
  | absent | present | absent, unreadable or incomplete | refuse; Open Devlyn to repair its storage registration |
108
108
 
109
- The journal `storage-client-unenroll.json` is read no-follow only on the last two
110
- rows. Schema 1, canonical UUIDv7 operation, permanent `storage-client-fence.json`,
109
+ An unfinished retirement takes precedence over enrollment; follow its
110
+ operation-specific retained-helper resume to reconcile or cancel as named.
111
+ The journal `storage-client-unenroll.json` is read no-follow for retirement
112
+ recovery and the last two rows. Schema 1, canonical UUIDv7 operation, permanent `storage-client-fence.json`,
111
113
  matching operation/root/lock identities and Rust's archive ordering/path
112
114
  validation are required. If native root/lock identities or the home path changed,
113
115
  completed retirement permits standalone only when `storage`, `control`,
@@ -119,7 +121,9 @@ completed unenrollment; a leftover managed key retains its own recovery command.
119
121
  Existing operations keep their managed identity. Receipts pin the control
120
122
  identity; current enrollment verifies the helper before allocation. Recovery uses
121
123
  the current verified `storage-client-recovery/pins.json`, including after uninstall
122
- or unenrollment, and requires its authority binding to match the receipt. Missing
124
+ or unenrollment, and requires its authority binding to match the receipt, except
125
+ for a proven moved task: use its unflagged, operation-specific `recover-storage`
126
+ resume to release it, retain its files, and archive its receipt under `moved/`. Missing
123
127
  or invalid pins retain resources and require repair; saved artifacts are never a
124
128
  fallback. Enrolled checkout preserves
125
129
  `managed_pending`/`managed_owned` and Rust's `storage-allocation.json` subreceipt.
@@ -3,7 +3,7 @@ name: devlyn-ideate
3
3
  description: Loop designer and intent queue. Turns an intent or a document into a validated loop package (a meta-prompt plus self-contained task contracts), queues its tasks, reports queue status, and drains the queue serially with evidence-derived acceptance, recovery and delivery. Operations — plan, add, status, drain; a bare intent is planned and, when the request authorizes implementation, continues through add and drain; no arguments shows status. Use when the user wants an idea, goal or document planned into tasks, wants to stack work ("queue this", "큐에 넣어줘"), asks what is queued, or wants unattended execution ("drain the queue", "큐 드레인 시작", "밤새 돌려줘").
4
4
  ---
5
5
 
6
- Ideate owns planning and durable serial execution. Each task runs under the installed methodology, the CLAUDE.md/AGENTS.md instruction block; ideate adds no phase graph, reviewer quota, engine router or restart cycle.
6
+ Ideate owns planning and durable serial execution. Each task runs under the installed methodology, the Devlyn defaults and project instructions; ideate adds no phase graph, reviewer quota, engine router or restart cycle.
7
7
 
8
8
  <ideate_args>
9
9
  $ARGUMENTS
@@ -94,7 +94,7 @@ A removed flag stops with its instruction and selects no other behavior.
94
94
 
95
95
  An absolute path to a package's `meta.md` is added as it is; anything else is planned first. Add with `python3 "$DEVLYN_SKILL_DIR/scripts/queue.py" add '<absolute meta.md>'`, the only writer of a loop's queue file `docs/specs/<loop-id>/queue.md`; never edit one by hand. In every delivery mode add makes no commit on the checked-out branch and leaves the branch, the index and tracked files as they are: it holds the package and its rows at `refs/devlyn/captures/<loop-id>`, records the add and removes the package copies equal to that capture. Report the capture ref and its `git show` command, any `cleanup` entry, and that a revision needs a new loop id. A retry of the same add reports it as added, also once the copies are gone. Tasks start from committed state, a local loop from the branch it was added on and `auto`/`pr` from the remote base, so commit, and for `auto`/`pr` push, whatever the plan depends on. A pending legacy raw-intent row of `docs/specs/queue.md` is replaced in place by a package whose `## Intent` reproduces the row verbatim, added with `--materialize <line>`.
96
96
 
97
- Release-backed queues retain their verified release in `<git-common-dir>/devlyn-loops/harness.json` until all tasks, recovery and delivery settle. A different release refuses with the exact recovery argv; use it. Existing unfinished unbound queues and standalone installations remain legacy.
97
+ Release-backed queues retain their verified release in `<git-common-dir>/devlyn-loops/harness.json` until all tasks, recovery and delivery settle. A different release refuses: use the exact recovery argv when it gives one; otherwise do what it says (Drain in Devlyn, the tasks to finish first, or a repair). Never build the bound queue's path yourself. Existing unfinished unbound queues and standalone installations remain legacy.
98
98
 
99
99
  ## status
100
100
 
@@ -55,9 +55,9 @@ Package cleanup, parent pruning and report failures appear as diagnostics under
55
55
 
56
56
  ## Release binding and read-only consumers
57
57
 
58
- `<git-common-dir>/devlyn-loops/harness.json` is authoritative across linked worktrees: `{schemaVersion: 1, release: {package, version, digest, root}, defaults: {path, sha256}}`. Paths are absolute and hashes cover exact bytes. The queue lock covers binding before the first capture. An interrupted first add, unfinished tasks, recovery conflicts and pending delivery retain it; settlement removes it. A different release refuses with `recovery argv` as a JSON argv array, preserving the caller’s arguments. No caller substitutes another implementation.
58
+ `<git-common-dir>/devlyn-loops/harness.json` is authoritative across linked worktrees: `{schemaVersion: 1, release: {package, version, digest, root}, defaults: {path, sha256}}`. Paths are absolute and hashes cover exact bytes. The queue lock covers binding before the first capture. An interrupted first add, unfinished tasks, recovery conflicts and pending delivery retain it; settlement removes it. A different release refuses: use the exact recovery argv when it gives one (a JSON argv array preserving the caller’s arguments); otherwise do what it says (Drain in Devlyn, the tasks to finish first, or a repair). Never build the bound queue’s path yourself. No caller substitutes another implementation.
59
59
 
60
- `queue.py inspect --repo <dir> --json` reads without cleanup, locks or writes. It returns the status summary plus `binding` (null for legacy) and `compatibility`: `compatible`, `legacy`, `reasons`, `recoveryArgv`, `taskPacket` ranges and `queueBinding` ranges. Incompatible or unreadable state is reported, never migrated. Apps should use this reader instead of `status`, which still reconciles cleanup. For a mismatch, `recoveryArgv` names the bound queue’s inspect invocation; use the same bound queue entry point for authorized add/drain operations.
60
+ `queue.py inspect --repo <dir> --json` reads without cleanup, locks or writes. It returns the status summary plus `binding` (null for legacy) and `compatibility`: `compatible`, `legacy`, `reasons`, `recoveryArgv`, `taskPacket` ranges and `queueBinding` ranges. Incompatible or unreadable state is reported, never migrated. Apps should use this reader instead of `status`, which still reconciles cleanup. For a mismatch, `recoveryArgv` names the bound queue’s inspect invocation when handoff is allowed, and is null when the refusal names Drain in Devlyn, tasks to finish first, or a repair. Use an exact recovery argv when provided; otherwise follow the refusal.
61
61
 
62
62
  Codex projection writers place `.devlyn-harness-projection.json` at the copied plugin root, beside `skills` and `.codex-plugin`: `{schemaVersion: 1, release: <ReleaseRef>, source: "native/codex/plugins/devlyn"}`. The reader verifies the named release and every projected file’s bytes/mode against that subtree (excluding only the marker). Symlinked skill invocations resolve through their real path. Standalone installs and existing unfinished unbound queues retain legacy behavior; new legacy packets use v2 with a null release, and their `defaults` name the invoking installation's own `_shared/runtime-principles.md` (`source: "skill"`). No engine applicability is inferred from instruction filenames: bound queues use verified release defaults with native instructions taking precedence, except a Devlyn managed block, which the defaults replace. Worker and runner paths point to the bound release, independent of a projection cache’s lifetime.
63
63
 
@@ -188,8 +188,11 @@ def enforce_binding(common, anchor=None):
188
188
  if binding and anchor is not None and release_settled_binding(anchor, common, interrupted_add=True):
189
189
  return enforce_binding(common)
190
190
  if binding:
191
- argv = harness_call("recovery_argv", binding, sys.argv[1:])
192
- raise LoopError(f"{exc}; recovery argv: {json.dumps(argv, ensure_ascii=False)}") from exc
191
+ line = shared("storage-client")["queue_handoff"](common, binding)
192
+ argv = harness_call("recovery_argv", binding, sys.argv[1:]) if line is None else None
193
+ error = LoopError(f"{exc}; {line}" if line is not None else f"{exc}; recovery argv: {json.dumps(argv, ensure_ascii=False)}")
194
+ error.handoff = line
195
+ raise error from exc
193
196
  raise
194
197
  return binding
195
198
 
@@ -1661,7 +1664,11 @@ def inspect(args):
1661
1664
  compatibility.update(compatible=False, reasons=[str(exc)])
1662
1665
  try:
1663
1666
  valid = harness_call("read_binding", common)
1664
- if valid:
1667
+ if hasattr(exc, "handoff"):
1668
+ line = exc.handoff
1669
+ else:
1670
+ line = shared("storage-client")["queue_handoff"](common, valid) if valid else None
1671
+ if valid and line is None:
1665
1672
  compatibility["recoveryArgv"] = harness_call("recovery_argv", valid, ["inspect", "--repo", str(anchor), "--json"])
1666
1673
  except (LoopError, OSError):
1667
1674
  pass # The diagnostic above describes the malformed binding; no safe argv can be inferred.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "devlyn-cli",
3
- "version": "4.3.25",
4
- "description": "Loop & harness engineering for AI coding agents (Claude Code, Codex, and any AGENTS.md-driven agent) — core engineering principles for CLAUDE.md/AGENTS.md and a loop designer that splits one intent into tasks agents drain hands-free",
3
+ "version": "4.3.28",
4
+ "description": "Loop & harness engineering for AI coding agents (Claude Code, Codex, and any AGENTS.md-driven agent) — core engineering principles for every session and a loop designer that splits one intent into tasks agents drain hands-free",
5
5
  "homepage": "https://github.com/fysoul17/devlyn-cli#readme",
6
6
  "bin": {
7
7
  "devlyn": "bin/devlyn.js"
package/release.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "package": "devlyn-cli",
4
- "version": "4.3.25",
4
+ "version": "4.3.28",
5
5
  "principles": {
6
6
  "defaults": "config/skills/_shared/runtime-principles.md",
7
7
  "memory": {
8
8
  "claude": "harness/CLAUDE.md",
9
9
  "agents": "harness/AGENTS.md"
10
10
  },
11
- "sourceBlockSha256": "25ed8e19648642bab459f945a6608ea1d7fe217497c29840d49d3d65a6de1092"
11
+ "sourceBlockSha256": "f2206e5ed1c96a6c5fc368836bb041e8e77328048ca617f902ed6fb72dcb742d"
12
12
  },
13
13
  "skills": {
14
14
  "root": "config/skills",
@@ -99,12 +99,12 @@
99
99
  "files": [
100
100
  {
101
101
  "path": "AGENTS.md",
102
- "sha256": "7c4a95c1cf79c527708c12771c5ce899592e1d40298da0651eb891a6ed90bb70",
102
+ "sha256": "7a624c175486712f08ad5ad45c7979db1c1d0db35f3bfd2c4a068585b7f23f13",
103
103
  "executable": false
104
104
  },
105
105
  {
106
106
  "path": "CLAUDE.md",
107
- "sha256": "7c4a95c1cf79c527708c12771c5ce899592e1d40298da0651eb891a6ed90bb70",
107
+ "sha256": "7a624c175486712f08ad5ad45c7979db1c1d0db35f3bfd2c4a068585b7f23f13",
108
108
  "executable": false
109
109
  },
110
110
  {
@@ -114,7 +114,7 @@
114
114
  },
115
115
  {
116
116
  "path": "README.md",
117
- "sha256": "08bb882cc64cdaa3cab446a26c54847cb5c52992f838306163d0a90a764fffb5",
117
+ "sha256": "c4c554a6ae739264fc5f78fd1ba232d993e6ca18d54e3bfdbe87b7131ecedd92",
118
118
  "executable": false
119
119
  },
120
120
  {
@@ -129,7 +129,7 @@
129
129
  },
130
130
  {
131
131
  "path": "bin/devlyn.js",
132
- "sha256": "f1450b804131b9f6b5d1ec61ce06da5e6ebd4f73d10e4c1bc01906b27cd136a9",
132
+ "sha256": "bcacbcf010cb7faee8323297d3f2542a8baa95de98c8dc99f122b78b8bb64b68",
133
133
  "executable": true
134
134
  },
135
135
  {
@@ -139,7 +139,17 @@
139
139
  },
140
140
  {
141
141
  "path": "bin/harness-activation.js",
142
- "sha256": "b864c9e325e3e7bd6f800e51d456cb00d40925d6f0713a0c692cff207a9c6183",
142
+ "sha256": "6629838a15e84f37e932de5e99a0b06b23cb35c0921330cbb3390fe9526cfc0c",
143
+ "executable": false
144
+ },
145
+ {
146
+ "path": "bin/harness-context.js",
147
+ "sha256": "6b2e8d35592305c533bc0c3ee63a3655e1f51620a4baad977cb2f31f6b60d2c2",
148
+ "executable": false
149
+ },
150
+ {
151
+ "path": "bin/harness-run.js",
152
+ "sha256": "c4dcd1f7776834e9c5af2a497f900f6de01b2e5e817335e0de48714de4885e55",
143
153
  "executable": false
144
154
  },
145
155
  {
@@ -149,12 +159,12 @@
149
159
  },
150
160
  {
151
161
  "path": "bin/instruction-templates.json",
152
- "sha256": "4b6543015cfdfa6c73189238fefcb26171741d29890acb5787a0662c76080e0d",
162
+ "sha256": "5a46284e5d7024e406b7c2e55eb53beb9253108abb890bf550358bdde82ee4e6",
153
163
  "executable": false
154
164
  },
155
165
  {
156
166
  "path": "bin/instructions.js",
157
- "sha256": "b47b8748f7138788f9f39d62feaf71ea0db7d91d67ee6fc911d5abeb99939b5b",
167
+ "sha256": "7f9c95fd5ec68b3c95c8cd0be0f3a65596a1ec5f4f264523622e304838c40a25",
158
168
  "executable": false
159
169
  },
160
170
  {
@@ -164,7 +174,7 @@
164
174
  },
165
175
  {
166
176
  "path": "bin/skill-history.json",
167
- "sha256": "c137de72e6ca67b53800f1a5f777f44b00dcbdfa1e036ccf38174177f5fed69e",
177
+ "sha256": "2634903f8ca3cc2b013752bc3dd51590364a6afa5d02124dbdef5d1466c0eb93",
168
178
  "executable": false
169
179
  },
170
180
  {
@@ -244,27 +254,27 @@
244
254
  },
245
255
  {
246
256
  "path": "config/skills/_shared/runtime-principles.md",
247
- "sha256": "ca6e84c50e8fbe22acdd447f012ff894e0ebe72ba381de33d9a94c18dfa9cc19",
257
+ "sha256": "f1c0647e8da37b900c5d83487948dc85d4663275e0f0a282e9d49df219f9b085",
248
258
  "executable": false
249
259
  },
250
260
  {
251
261
  "path": "config/skills/_shared/storage-checkout.py",
252
- "sha256": "4dbd004375972c09cb0e3d85719f9729ed0f0758c89b557a90aea150f288537e",
262
+ "sha256": "b12fb9f48c6e46b7544091bbd663cc9090389c92a16f32ac1ef8c51e0f90b77b",
253
263
  "executable": false
254
264
  },
255
265
  {
256
266
  "path": "config/skills/_shared/storage-client.py",
257
- "sha256": "118aa6eea642ef3cfe7cfd901d51310efa13162425aae68048cbedf1907b3fa2",
267
+ "sha256": "b0e8d7cfd6b9d03a9e2988da4652e53310a8c3e3785160ed7c4c24e264c3223f",
258
268
  "executable": false
259
269
  },
260
270
  {
261
271
  "path": "config/skills/_shared/task-complete.py",
262
- "sha256": "364dbaa28b0d01dcbdf7855be7af1d114094605ef343a579afb7d56aaabbb8e9",
272
+ "sha256": "8150cdb6a2d7bb7d493e3028cde6fb3b4ee6d85ff089ca30d8ffeab3327e91cb",
263
273
  "executable": false
264
274
  },
265
275
  {
266
276
  "path": "config/skills/_shared/task-completion.md",
267
- "sha256": "c93128b4f16f7c21eccd5bed9afdb3d4beb8c756545dca1d7b1de45dd456e713",
277
+ "sha256": "ce0691632b113b78a7dd268b2d456c6ef25c6bad2a2c075cd950dd49dfaaec73",
268
278
  "executable": false
269
279
  },
270
280
  {
@@ -284,7 +294,7 @@
284
294
  },
285
295
  {
286
296
  "path": "config/skills/devlyn-ideate/SKILL.md",
287
- "sha256": "2901fa7cb69d41fd3321d3846b742b3bc1a77c760eb49bd874c4c745b550553d",
297
+ "sha256": "529f7b13f52cd5a1b2e619b45a7004ed281ed5be440c867dc3171d79d40d9c2f",
288
298
  "executable": false
289
299
  },
290
300
  {
@@ -294,7 +304,7 @@
294
304
  },
295
305
  {
296
306
  "path": "config/skills/devlyn-ideate/references/loop.md",
297
- "sha256": "8dd5ac20d9513e9c0b309a02170deec8642ae5945f1fb082ccc8b04fbc2422bc",
307
+ "sha256": "4af00f91159d889ec8ab7c853faf9db505a9f3aad9604f43bb666bb6e7873b77",
298
308
  "executable": false
299
309
  },
300
310
  {
@@ -314,7 +324,7 @@
314
324
  },
315
325
  {
316
326
  "path": "config/skills/devlyn-ideate/scripts/queue.py",
317
- "sha256": "afd2f9fc8e5be73641cfa46a9de40c38b573dff6b22714d1457babe04f5c1b2f",
327
+ "sha256": "64de33eff3c47963a6e86159f086a780c613a8064d582e1d6d422d2d7060069e",
318
328
  "executable": false
319
329
  },
320
330
  {
@@ -324,17 +334,17 @@
324
334
  },
325
335
  {
326
336
  "path": "harness/AGENTS.md",
327
- "sha256": "c38f62ed1d15fe3448d8c1cca3c99df410168fdd83e3d2af5e933e9a7112dfd1",
337
+ "sha256": "5f5522addafc26ff778e24552b3bdbeb41412f82881032bc91621ff392cd40d5",
328
338
  "executable": false
329
339
  },
330
340
  {
331
341
  "path": "harness/CLAUDE.md",
332
- "sha256": "c38f62ed1d15fe3448d8c1cca3c99df410168fdd83e3d2af5e933e9a7112dfd1",
342
+ "sha256": "5f5522addafc26ff778e24552b3bdbeb41412f82881032bc91621ff392cd40d5",
333
343
  "executable": false
334
344
  },
335
345
  {
336
346
  "path": "native/claude/.claude-plugin/plugin.json",
337
- "sha256": "f2d0eb5a6bccfe88a6e5b8a5117f309f41f724d00acdeff4eac8a1b310ca907b",
347
+ "sha256": "3e091ef7eb0e59d7cd856387286fd03c90ebaf7a206ee3896794c8bab3cc0864",
338
348
  "executable": false
339
349
  },
340
350
  {
@@ -409,27 +419,27 @@
409
419
  },
410
420
  {
411
421
  "path": "native/claude/skills/_shared/runtime-principles.md",
412
- "sha256": "ca6e84c50e8fbe22acdd447f012ff894e0ebe72ba381de33d9a94c18dfa9cc19",
422
+ "sha256": "f1c0647e8da37b900c5d83487948dc85d4663275e0f0a282e9d49df219f9b085",
413
423
  "executable": false
414
424
  },
415
425
  {
416
426
  "path": "native/claude/skills/_shared/storage-checkout.py",
417
- "sha256": "4dbd004375972c09cb0e3d85719f9729ed0f0758c89b557a90aea150f288537e",
427
+ "sha256": "b12fb9f48c6e46b7544091bbd663cc9090389c92a16f32ac1ef8c51e0f90b77b",
418
428
  "executable": false
419
429
  },
420
430
  {
421
431
  "path": "native/claude/skills/_shared/storage-client.py",
422
- "sha256": "118aa6eea642ef3cfe7cfd901d51310efa13162425aae68048cbedf1907b3fa2",
432
+ "sha256": "b0e8d7cfd6b9d03a9e2988da4652e53310a8c3e3785160ed7c4c24e264c3223f",
423
433
  "executable": false
424
434
  },
425
435
  {
426
436
  "path": "native/claude/skills/_shared/task-complete.py",
427
- "sha256": "364dbaa28b0d01dcbdf7855be7af1d114094605ef343a579afb7d56aaabbb8e9",
437
+ "sha256": "8150cdb6a2d7bb7d493e3028cde6fb3b4ee6d85ff089ca30d8ffeab3327e91cb",
428
438
  "executable": false
429
439
  },
430
440
  {
431
441
  "path": "native/claude/skills/_shared/task-completion.md",
432
- "sha256": "c93128b4f16f7c21eccd5bed9afdb3d4beb8c756545dca1d7b1de45dd456e713",
442
+ "sha256": "ce0691632b113b78a7dd268b2d456c6ef25c6bad2a2c075cd950dd49dfaaec73",
433
443
  "executable": false
434
444
  },
435
445
  {
@@ -449,7 +459,7 @@
449
459
  },
450
460
  {
451
461
  "path": "native/claude/skills/devlyn-ideate/SKILL.md",
452
- "sha256": "2901fa7cb69d41fd3321d3846b742b3bc1a77c760eb49bd874c4c745b550553d",
462
+ "sha256": "529f7b13f52cd5a1b2e619b45a7004ed281ed5be440c867dc3171d79d40d9c2f",
453
463
  "executable": false
454
464
  },
455
465
  {
@@ -459,7 +469,7 @@
459
469
  },
460
470
  {
461
471
  "path": "native/claude/skills/devlyn-ideate/references/loop.md",
462
- "sha256": "8dd5ac20d9513e9c0b309a02170deec8642ae5945f1fb082ccc8b04fbc2422bc",
472
+ "sha256": "4af00f91159d889ec8ab7c853faf9db505a9f3aad9604f43bb666bb6e7873b77",
463
473
  "executable": false
464
474
  },
465
475
  {
@@ -479,17 +489,17 @@
479
489
  },
480
490
  {
481
491
  "path": "native/claude/skills/devlyn-ideate/scripts/queue.py",
482
- "sha256": "afd2f9fc8e5be73641cfa46a9de40c38b573dff6b22714d1457babe04f5c1b2f",
492
+ "sha256": "64de33eff3c47963a6e86159f086a780c613a8064d582e1d6d422d2d7060069e",
483
493
  "executable": false
484
494
  },
485
495
  {
486
496
  "path": "native/codex/.agents/plugins/marketplace.json",
487
- "sha256": "3fcaa2f62b36f4aab8475d2ab10910ba0d6a55045a152399d358e2abbf2f5934",
497
+ "sha256": "3bfb2eec52c629987698484d0028d19ab40502a1f1555892fa058bbe8f72b90b",
488
498
  "executable": false
489
499
  },
490
500
  {
491
501
  "path": "native/codex/plugins/devlyn/.codex-plugin/plugin.json",
492
- "sha256": "f2d0eb5a6bccfe88a6e5b8a5117f309f41f724d00acdeff4eac8a1b310ca907b",
502
+ "sha256": "3e091ef7eb0e59d7cd856387286fd03c90ebaf7a206ee3896794c8bab3cc0864",
493
503
  "executable": false
494
504
  },
495
505
  {
@@ -564,27 +574,27 @@
564
574
  },
565
575
  {
566
576
  "path": "native/codex/plugins/devlyn/skills/_shared/runtime-principles.md",
567
- "sha256": "ca6e84c50e8fbe22acdd447f012ff894e0ebe72ba381de33d9a94c18dfa9cc19",
577
+ "sha256": "f1c0647e8da37b900c5d83487948dc85d4663275e0f0a282e9d49df219f9b085",
568
578
  "executable": false
569
579
  },
570
580
  {
571
581
  "path": "native/codex/plugins/devlyn/skills/_shared/storage-checkout.py",
572
- "sha256": "4dbd004375972c09cb0e3d85719f9729ed0f0758c89b557a90aea150f288537e",
582
+ "sha256": "b12fb9f48c6e46b7544091bbd663cc9090389c92a16f32ac1ef8c51e0f90b77b",
573
583
  "executable": false
574
584
  },
575
585
  {
576
586
  "path": "native/codex/plugins/devlyn/skills/_shared/storage-client.py",
577
- "sha256": "118aa6eea642ef3cfe7cfd901d51310efa13162425aae68048cbedf1907b3fa2",
587
+ "sha256": "b0e8d7cfd6b9d03a9e2988da4652e53310a8c3e3785160ed7c4c24e264c3223f",
578
588
  "executable": false
579
589
  },
580
590
  {
581
591
  "path": "native/codex/plugins/devlyn/skills/_shared/task-complete.py",
582
- "sha256": "364dbaa28b0d01dcbdf7855be7af1d114094605ef343a579afb7d56aaabbb8e9",
592
+ "sha256": "8150cdb6a2d7bb7d493e3028cde6fb3b4ee6d85ff089ca30d8ffeab3327e91cb",
583
593
  "executable": false
584
594
  },
585
595
  {
586
596
  "path": "native/codex/plugins/devlyn/skills/_shared/task-completion.md",
587
- "sha256": "c93128b4f16f7c21eccd5bed9afdb3d4beb8c756545dca1d7b1de45dd456e713",
597
+ "sha256": "ce0691632b113b78a7dd268b2d456c6ef25c6bad2a2c075cd950dd49dfaaec73",
588
598
  "executable": false
589
599
  },
590
600
  {
@@ -604,7 +614,7 @@
604
614
  },
605
615
  {
606
616
  "path": "native/codex/plugins/devlyn/skills/devlyn-ideate/SKILL.md",
607
- "sha256": "2901fa7cb69d41fd3321d3846b742b3bc1a77c760eb49bd874c4c745b550553d",
617
+ "sha256": "529f7b13f52cd5a1b2e619b45a7004ed281ed5be440c867dc3171d79d40d9c2f",
608
618
  "executable": false
609
619
  },
610
620
  {
@@ -614,7 +624,7 @@
614
624
  },
615
625
  {
616
626
  "path": "native/codex/plugins/devlyn/skills/devlyn-ideate/references/loop.md",
617
- "sha256": "8dd5ac20d9513e9c0b309a02170deec8642ae5945f1fb082ccc8b04fbc2422bc",
627
+ "sha256": "4af00f91159d889ec8ab7c853faf9db505a9f3aad9604f43bb666bb6e7873b77",
618
628
  "executable": false
619
629
  },
620
630
  {
@@ -634,7 +644,7 @@
634
644
  },
635
645
  {
636
646
  "path": "native/codex/plugins/devlyn/skills/devlyn-ideate/scripts/queue.py",
637
- "sha256": "afd2f9fc8e5be73641cfa46a9de40c38b573dff6b22714d1457babe04f5c1b2f",
647
+ "sha256": "64de33eff3c47963a6e86159f086a780c613a8064d582e1d6d422d2d7060069e",
638
648
  "executable": false
639
649
  },
640
650
  {
@@ -1779,12 +1789,12 @@
1779
1789
  },
1780
1790
  {
1781
1791
  "path": "package.json",
1782
- "sha256": "2448478a5c2d95bc1cddde475d3d091942f4685c982ca5e52a7d1a267636fd4c",
1792
+ "sha256": "a38e945bb7156c250e9618b52f66fa0c47837a7c3cc80c7482df4b9b239ad1d9",
1783
1793
  "executable": false
1784
1794
  }
1785
1795
  ],
1786
1796
  "digest": {
1787
1797
  "algorithm": "sha256",
1788
- "value": "2a0d645e703b3aa32324d5890cbb83d6bf9174074e12dbf3f16e00c2f1ba7cb1"
1798
+ "value": "b8ea1a586c0096ed3f60ee9d5386b0d12123291da659ecc68658caae2ca21b65"
1789
1799
  }
1790
1800
  }