agentplane 0.3.3 → 0.3.5

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 (65) hide show
  1. package/assets/AGENTS.md +3 -3
  2. package/assets/agents/CODER.json +10 -7
  3. package/assets/agents/CREATOR.json +8 -6
  4. package/assets/agents/DOCS.json +8 -5
  5. package/assets/agents/INTEGRATOR.json +8 -5
  6. package/assets/agents/ORCHESTRATOR.json +7 -6
  7. package/assets/agents/PLANNER.json +8 -6
  8. package/assets/agents/REDMINE.json +6 -3
  9. package/assets/agents/REVIEWER.json +8 -6
  10. package/assets/agents/TESTER.json +6 -4
  11. package/assets/agents/UPDATER.json +6 -4
  12. package/assets/agents/UPGRADER.json +7 -6
  13. package/dist/.build-manifest.json +89 -74
  14. package/dist/adapters/task-backend/task-backend-adapter.d.ts +1 -1
  15. package/dist/adapters/task-backend/task-backend-adapter.d.ts.map +1 -1
  16. package/dist/adapters/task-backend/task-backend-adapter.js +5 -2
  17. package/dist/backends/task-backend/local-backend.d.ts +13 -0
  18. package/dist/backends/task-backend/local-backend.d.ts.map +1 -1
  19. package/dist/backends/task-backend/local-backend.js +17 -0
  20. package/dist/backends/task-backend/redmine-backend.d.ts +18 -0
  21. package/dist/backends/task-backend/redmine-backend.d.ts.map +1 -1
  22. package/dist/backends/task-backend/redmine-backend.js +35 -25
  23. package/dist/backends/task-backend/shared/types.d.ts +20 -0
  24. package/dist/backends/task-backend/shared/types.d.ts.map +1 -1
  25. package/dist/backends/task-backend/shared.d.ts +1 -1
  26. package/dist/backends/task-backend/shared.d.ts.map +1 -1
  27. package/dist/backends/task-backend.d.ts +1 -1
  28. package/dist/backends/task-backend.d.ts.map +1 -1
  29. package/dist/cli/bootstrap-guide.d.ts +1 -0
  30. package/dist/cli/bootstrap-guide.d.ts.map +1 -1
  31. package/dist/cli/bootstrap-guide.js +3 -2
  32. package/dist/cli/command-guide.d.ts +14 -1
  33. package/dist/cli/command-guide.d.ts.map +1 -1
  34. package/dist/cli/command-guide.js +50 -19
  35. package/dist/cli/run-cli/commands/core.d.ts.map +1 -1
  36. package/dist/cli/run-cli/commands/core.js +37 -29
  37. package/dist/cli/run-cli/commands/init/write-workflow.d.ts.map +1 -1
  38. package/dist/cli/run-cli/commands/init/write-workflow.js +6 -55
  39. package/dist/commands/doctor/workspace.d.ts +4 -1
  40. package/dist/commands/doctor/workspace.d.ts.map +1 -1
  41. package/dist/commands/doctor/workspace.js +87 -4
  42. package/dist/commands/doctor.run.d.ts.map +1 -1
  43. package/dist/commands/doctor.run.js +8 -1
  44. package/dist/commands/shared/git-context.d.ts +1 -0
  45. package/dist/commands/shared/git-context.d.ts.map +1 -1
  46. package/dist/commands/shared/git-context.js +4 -0
  47. package/dist/commands/shared/task-backend.d.ts +5 -0
  48. package/dist/commands/shared/task-backend.d.ts.map +1 -1
  49. package/dist/commands/shared/task-backend.js +24 -0
  50. package/dist/commands/task/export.d.ts.map +1 -1
  51. package/dist/commands/task/export.js +4 -4
  52. package/dist/commands/task/finish.d.ts.map +1 -1
  53. package/dist/commands/task/finish.js +3 -2
  54. package/dist/commands/task/migrate-doc.d.ts.map +1 -1
  55. package/dist/commands/task/migrate-doc.js +13 -3
  56. package/dist/commands/upgrade.d.ts.map +1 -1
  57. package/dist/commands/upgrade.js +22 -1
  58. package/dist/commands/workflow-build.command.d.ts.map +1 -1
  59. package/dist/commands/workflow-build.command.js +9 -15
  60. package/dist/ports/task-backend-port.d.ts +1 -1
  61. package/dist/ports/task-backend-port.d.ts.map +1 -1
  62. package/dist/shared/workflow-artifacts.d.ts +37 -0
  63. package/dist/shared/workflow-artifacts.d.ts.map +1 -0
  64. package/dist/shared/workflow-artifacts.js +97 -0
  65. package/package.json +2 -2
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schema_version": 1,
3
3
  "package_dir": "/home/runner/work/agentplane/agentplane/packages/agentplane",
4
- "generated_at": "2026-03-08T16:52:43.992Z",
5
- "git_head": "a34c41c7e667be5160fe0a0c06cb965bd78ea116",
6
- "src_cli_mtime_ms": 1772988709014.0527,
4
+ "generated_at": "2026-03-09T11:27:01.401Z",
5
+ "git_head": "048eac0e4c4643f9706ee28a314a47900c8aeda2",
6
+ "src_cli_mtime_ms": 1773055566738.3289,
7
7
  "src_index_mtime_ms": null,
8
- "dist_cli_mtime_ms": 1772988763291.725,
8
+ "dist_cli_mtime_ms": 1773055620787.9597,
9
9
  "dist_index_mtime_ms": null,
10
- "tsbuildinfo_mtime_ms": 1772988763346.7253,
10
+ "tsbuildinfo_mtime_ms": 1773055620840.9602,
11
11
  "watched_runtime_paths": [
12
12
  "src",
13
13
  "bin/agentplane.js",
@@ -15,7 +15,7 @@
15
15
  "bin/runtime-context.js",
16
16
  "bin/stale-dist-policy.js"
17
17
  ],
18
- "watched_runtime_snapshot_hash": "04c739ae8fa3ef0fef1f2ccd81bcd340afe3cb553d6671c400f4b358870c32ef",
18
+ "watched_runtime_snapshot_hash": "90fec1d16ff7e43a183c043b40ce90d2da4e35df365aed7509c0ef6a4ee8f40e",
19
19
  "watched_runtime_files": [
20
20
  {
21
21
  "path": "bin/agentplane.js",
@@ -59,8 +59,8 @@
59
59
  },
60
60
  {
61
61
  "path": "src/adapters/task-backend/task-backend-adapter.ts",
62
- "sha256": "7a108367bd1f59e9b6a41633258b773558acdeb02759c2d967c01e206fa68676",
63
- "size_bytes": 913
62
+ "sha256": "b071098191f407302cbb37793fd45934d17891b2e2ac628e69903535c5204dc6",
63
+ "size_bytes": 1034
64
64
  },
65
65
  {
66
66
  "path": "src/agents/agents-template.test.ts",
@@ -84,13 +84,13 @@
84
84
  },
85
85
  {
86
86
  "path": "src/backends/task-backend.test.ts",
87
- "sha256": "a11d7bc0242d1019415e4f29377f039868ee1823fafd2e220f135a66023cc3e7",
88
- "size_bytes": 75233
87
+ "sha256": "7995d304c2b494e69a80cb5f1d2ba5c26686d2aeebdca163187ca04b1f426059",
88
+ "size_bytes": 77948
89
89
  },
90
90
  {
91
91
  "path": "src/backends/task-backend.ts",
92
- "sha256": "578eecda648f8893a9babab2dd0c59015e99c8c702aa775592a1f3c6c86a952d",
93
- "size_bytes": 572
92
+ "sha256": "bf16b2ba5f73df3de0f5559ef26d4997926aed81b97b63d59bb5decabcd8e09c",
93
+ "size_bytes": 641
94
94
  },
95
95
  {
96
96
  "path": "src/backends/task-backend/load.ts",
@@ -99,13 +99,13 @@
99
99
  },
100
100
  {
101
101
  "path": "src/backends/task-backend/local-backend.ts",
102
- "sha256": "f040a3f4223d7715d209c24471f60a2d7f6216430798bd423e4c24bf1a0e1475",
103
- "size_bytes": 15356
102
+ "sha256": "4d2adf9517bd8e791a2f0993b90f4755f9d221d53eae6a85dc67477f8832d4bc",
103
+ "size_bytes": 15922
104
104
  },
105
105
  {
106
106
  "path": "src/backends/task-backend/redmine-backend.ts",
107
- "sha256": "1222f78dd54994ac61e419400cb318d6d7b551c3da2b27ca814492c1bc10a73e",
108
- "size_bytes": 25868
107
+ "sha256": "446f0a9b73c0aac28233c623b6ca234908ab725a64cce48794a2a04c86bd6e41",
108
+ "size_bytes": 26863
109
109
  },
110
110
  {
111
111
  "path": "src/backends/task-backend/redmine/client.ts",
@@ -132,6 +132,11 @@
132
132
  "sha256": "edd3a5fd31f139b7cec5eefccd78ff784dc8a44c62a133165208261094fff4f1",
133
133
  "size_bytes": 1483
134
134
  },
135
+ {
136
+ "path": "src/backends/task-backend/redmine/live.test.ts",
137
+ "sha256": "ff60d64abaf765448bec556d3ebdd2c35e1711ef2ba9244cc9c5b09fbd201c17",
138
+ "size_bytes": 3189
139
+ },
135
140
  {
136
141
  "path": "src/backends/task-backend/redmine/mapping.ts",
137
142
  "sha256": "cd327da5e9745c35cf20ca4e5b63cb6e29cea947e6e312a22d219181a0925d3b",
@@ -149,8 +154,8 @@
149
154
  },
150
155
  {
151
156
  "path": "src/backends/task-backend/shared.ts",
152
- "sha256": "7921ae58c128342a09f153cbc02c1fe187d0461083edd95162e1f6c0034cf74a",
153
- "size_bytes": 672
157
+ "sha256": "f892c20754f8c43bbb8270c7f574fc15abbbe21ce57d7612f5cb7e4f2fd01d63",
158
+ "size_bytes": 731
154
159
  },
155
160
  {
156
161
  "path": "src/backends/task-backend/shared/concurrency.ts",
@@ -204,8 +209,8 @@
204
209
  },
205
210
  {
206
211
  "path": "src/backends/task-backend/shared/types.ts",
207
- "sha256": "19eb19aa4c221b7c1ac5461312c5c05e8b35307bd4432c955986b5673dc8c47e",
208
- "size_bytes": 2301
212
+ "sha256": "6e7ee2be6a314c92fab96630dea044eac767710d0089dbc38e2f3e9c5bdb44c3",
213
+ "size_bytes": 3070
209
214
  },
210
215
  {
211
216
  "path": "src/backends/task-index.ts",
@@ -234,8 +239,8 @@
234
239
  },
235
240
  {
236
241
  "path": "src/cli/bootstrap-guide.ts",
237
- "sha256": "933ed2163a87421fd8e0c53d82c965b933b53cd79393e3f860aa51bcc893c8a4",
238
- "size_bytes": 4840
242
+ "sha256": "be6a4e82e5b1d7d876749f0b1d04e234aeddefb3a2601d11fc86139c59fadfcd",
243
+ "size_bytes": 4962
239
244
  },
240
245
  {
241
246
  "path": "src/cli/checksum.test.ts",
@@ -264,13 +269,13 @@
264
269
  },
265
270
  {
266
271
  "path": "src/cli/command-guide.test.ts",
267
- "sha256": "b0a6bed0203d2248a8c2f4a95119a2947ae280ffa30c281a6d6d28e4c2dbbf01",
268
- "size_bytes": 1516
272
+ "sha256": "17ee80b536d7b2a2ef1392f1d28265660de4e4e6f995d485da85e6e4fed00b99",
273
+ "size_bytes": 2632
269
274
  },
270
275
  {
271
276
  "path": "src/cli/command-guide.ts",
272
- "sha256": "41e14990b548b5696463137662f629df3dbc1de29d286b3ee04d895b6fdf88ed",
273
- "size_bytes": 7901
277
+ "sha256": "3e873714538832069e13b7eb9bb9a672c847cdde82d165f8f275281fedae2b57",
278
+ "size_bytes": 8954
274
279
  },
275
280
  {
276
281
  "path": "src/cli/command-snippets.ts",
@@ -349,8 +354,8 @@
349
354
  },
350
355
  {
351
356
  "path": "src/cli/local-ci-selection.test.ts",
352
- "sha256": "afe6f19339b0ae29296c44d26b33649d6d0be34e429666114207bd6757d55be3",
353
- "size_bytes": 8052
357
+ "sha256": "a32dd8188e3410037b1cbe31a307be645110249e255c3c32a783397da054104a",
358
+ "size_bytes": 8783
354
359
  },
355
360
  {
356
361
  "path": "src/cli/output.test.ts",
@@ -399,8 +404,8 @@
399
404
  },
400
405
  {
401
406
  "path": "src/cli/repo-local-handoff.test.ts",
402
- "sha256": "fdfc87a3e68d24ced99fa5261bd3dd4f97efa9387db9fc648a25fb7bf2ff7aca",
403
- "size_bytes": 6250
407
+ "sha256": "7058826fc50f56c94dc9bcd6ea804cd07aa7a5fafa8bb3d53e74c4f04e3e4741",
408
+ "size_bytes": 6671
404
409
  },
405
410
  {
406
411
  "path": "src/cli/run-cli.core.boot.test.ts",
@@ -439,8 +444,8 @@
439
444
  },
440
445
  {
441
446
  "path": "src/cli/run-cli.core.init-upgrade-backend.test.ts",
442
- "sha256": "e216c2f0eb3b535b0227d768509159d14280d828f08bc2a48ecffe2e5a906efe",
443
- "size_bytes": 65672
447
+ "sha256": "6602a67b7837dcf1e4de7c554df9f27f26ee5a5bfe567862cdb6c5897d7e93fb",
448
+ "size_bytes": 67521
444
449
  },
445
450
  {
446
451
  "path": "src/cli/run-cli.core.lifecycle.test.ts",
@@ -459,8 +464,8 @@
459
464
  },
460
465
  {
461
466
  "path": "src/cli/run-cli.core.tasks.test.ts",
462
- "sha256": "852ecffaf3e316e2b25fd3212a68efc2c04b7404c61e3cdeaa23a1af05b8547a",
463
- "size_bytes": 73052
467
+ "sha256": "409ca8844e6439bd731f0573b49664ff49a7937f1635f7dfb0bbe783db1e42e3",
468
+ "size_bytes": 75281
464
469
  },
465
470
  {
466
471
  "path": "src/cli/run-cli.core.test.ts",
@@ -529,13 +534,13 @@
529
534
  },
530
535
  {
531
536
  "path": "src/cli/run-cli/commands/core.ts",
532
- "sha256": "1a265897188ba9c52104af24fb882af33ae97d73e3ad4ea76ebc97d5ddeb3a95",
533
- "size_bytes": 25623
537
+ "sha256": "4c2625cef5df4cdc3e88fecee11c6a9bacdec82c3692fdf5f599bbc8504a92ec",
538
+ "size_bytes": 25497
534
539
  },
535
540
  {
536
541
  "path": "src/cli/run-cli/commands/core.unit.test.ts",
537
- "sha256": "161d12fcc065f981937d75ce7235da0565d307a9915fdb5a7e53454edaed52f7",
538
- "size_bytes": 8058
542
+ "sha256": "900f25dfbfefa579e1cc16ca9f54a41d99fb9de63d03eda0f3a8485b53cfb181",
543
+ "size_bytes": 9873
539
544
  },
540
545
  {
541
546
  "path": "src/cli/run-cli/commands/ide.ts",
@@ -604,8 +609,8 @@
604
609
  },
605
610
  {
606
611
  "path": "src/cli/run-cli/commands/init/write-workflow.ts",
607
- "sha256": "e5609693772272f3b8b48a90df8a4a619096d23843b026c7578b97dcc054452e",
608
- "size_bytes": 2255
612
+ "sha256": "e1d68f14803f2557608ad06b5f0580f373120350d0cf6fcdc087699ca8098b7a",
613
+ "size_bytes": 564
609
614
  },
610
615
  {
611
616
  "path": "src/cli/run-cli/commands/wrap-command.ts",
@@ -854,8 +859,8 @@
854
859
  },
855
860
  {
856
861
  "path": "src/commands/doctor.command.test.ts",
857
- "sha256": "adb2daa2a3b6347ef8ccae3854648c0ef588ce4de3d5206cf115caf66ddfd37e",
858
- "size_bytes": 28295
862
+ "sha256": "5bebb82be6d8529d0c383a6e336582a33d691bf050ff316ab71c77ee2ea85e44",
863
+ "size_bytes": 33600
859
864
  },
860
865
  {
861
866
  "path": "src/commands/doctor.command.ts",
@@ -869,8 +874,8 @@
869
874
  },
870
875
  {
871
876
  "path": "src/commands/doctor.run.ts",
872
- "sha256": "43ed51e6f9433e29fb2aa6fa1da7f36d334c40bbaa4ca3807edb42576e8c54e5",
873
- "size_bytes": 2834
877
+ "sha256": "5ab07ce809fca591d882ae1259d9ee484469b2fba8f4358e62c2db990259654b",
878
+ "size_bytes": 3098
874
879
  },
875
880
  {
876
881
  "path": "src/commands/doctor.spec.ts",
@@ -904,8 +909,8 @@
904
909
  },
905
910
  {
906
911
  "path": "src/commands/doctor/workspace.ts",
907
- "sha256": "340789e6493dbb4d62e6d79e6fad08f06667b6f151a441a742ee3f735cffb9dd",
908
- "size_bytes": 6582
912
+ "sha256": "d7d33a2f6906bbf731197261af8fc15b1d0d1a25cdf113b002c7667a75460b3e",
913
+ "size_bytes": 9961
909
914
  },
910
915
  {
911
916
  "path": "src/commands/finish.command.ts",
@@ -1339,8 +1344,8 @@
1339
1344
  },
1340
1345
  {
1341
1346
  "path": "src/commands/release/apply.test.ts",
1342
- "sha256": "f16621a2222bbc102633a0225d276e8fc5477bf301be8cc65ed213e4b8f515ff",
1343
- "size_bytes": 27414
1347
+ "sha256": "bfcb939cdefbc0e0bc30f4c38140736589ca9a1da40ba7d6b477474b601f7a93",
1348
+ "size_bytes": 27438
1344
1349
  },
1345
1350
  {
1346
1351
  "path": "src/commands/release/apply.types.ts",
@@ -1379,8 +1384,8 @@
1379
1384
  },
1380
1385
  {
1381
1386
  "path": "src/commands/runtime.command.test.ts",
1382
- "sha256": "f7801e0d2bad37a76ad63beb97ce621bd1ac4a683b9745f796288b5df820fa56",
1383
- "size_bytes": 7811
1387
+ "sha256": "fe012609e1fd20994838123e1be33577cb4112f3dc0b4970ed17a116948ef4f7",
1388
+ "size_bytes": 8079
1384
1389
  },
1385
1390
  {
1386
1391
  "path": "src/commands/runtime.command.ts",
@@ -1439,13 +1444,13 @@
1439
1444
  },
1440
1445
  {
1441
1446
  "path": "src/commands/shared/git-context.test.ts",
1442
- "sha256": "f5c0bc396ddc6fea4db7885eb61d2bcabab6bfaa67eba61564abaef1d6a7dc0c",
1443
- "size_bytes": 2607
1447
+ "sha256": "4dfafb9bdb4d57ad4671bf28553a69575427248de7bdc06b1a495647a4e81f8b",
1448
+ "size_bytes": 3047
1444
1449
  },
1445
1450
  {
1446
1451
  "path": "src/commands/shared/git-context.ts",
1447
- "sha256": "7d640519d01dff1aab9d1df7c17bcda2fd10eb09085313e2c5f9dcac7080e798",
1448
- "size_bytes": 5445
1452
+ "sha256": "25ba607fbb8fd17f9b61348a0edfc397c42786c54bad0411e7c75309b02baf1a",
1453
+ "size_bytes": 5586
1449
1454
  },
1450
1455
  {
1451
1456
  "path": "src/commands/shared/git-diff.ts",
@@ -1514,8 +1519,8 @@
1514
1519
  },
1515
1520
  {
1516
1521
  "path": "src/commands/shared/task-backend.ts",
1517
- "sha256": "8d339ca7d8e765c98b0beb47af5773f9b83d2692a2b5d0c297c64e15762e8b38",
1518
- "size_bytes": 4748
1522
+ "sha256": "7c9e1c1601a984c92e9c50e3a81078d5f27bdc92829eeae751d141e16decab09",
1523
+ "size_bytes": 5624
1519
1524
  },
1520
1525
  {
1521
1526
  "path": "src/commands/shared/task-store.test.ts",
@@ -1634,18 +1639,23 @@
1634
1639
  },
1635
1640
  {
1636
1641
  "path": "src/commands/task/export.ts",
1637
- "sha256": "2a8585f69e1ed3f0b36313d5cf0e336cde7c1ec0c1f25ad1b7d6a024525732b2",
1638
- "size_bytes": 1120
1642
+ "sha256": "1083c3a4b33b5b20a4e3cb3659fb036e5875f8cd0778cf1ef841e7efa79c7c3e",
1643
+ "size_bytes": 1229
1644
+ },
1645
+ {
1646
+ "path": "src/commands/task/export.unit.test.ts",
1647
+ "sha256": "861656d40ace849513d5d4ee3f859edbf3ff2f049211c2453d3f3f0e590c3091",
1648
+ "size_bytes": 2729
1639
1649
  },
1640
1650
  {
1641
1651
  "path": "src/commands/task/finish.ts",
1642
- "sha256": "06e28a7057abcac3484d4a2310ab09ebbb86a4505c5d3850cae547d49dad0bd1",
1643
- "size_bytes": 15948
1652
+ "sha256": "946d09b225659ce3b14321748a02fb6efe60263ee85a2ac1611778373aa4c587",
1653
+ "size_bytes": 16076
1644
1654
  },
1645
1655
  {
1646
1656
  "path": "src/commands/task/finish.unit.test.ts",
1647
- "sha256": "7037a179e51e1f8b572d42bd7bdf670dc36b8a9b0c8f15fc2eb461655312ba2d",
1648
- "size_bytes": 26103
1657
+ "sha256": "a09144e1e2ba31614203280ffc979e01be78af29f9ffbfc4d333217ac9616478",
1658
+ "size_bytes": 30822
1649
1659
  },
1650
1660
  {
1651
1661
  "path": "src/commands/task/index.ts",
@@ -1689,13 +1699,13 @@
1689
1699
  },
1690
1700
  {
1691
1701
  "path": "src/commands/task/migrate-doc.test.ts",
1692
- "sha256": "2099b8f2eb2383f98b4321e1c6617b6db763dd4c467eda00622356ee45893929",
1693
- "size_bytes": 10909
1702
+ "sha256": "41cbc75077261ecb891c22bc8ad31b6d1dee7d039c4a1b32703c1bb766a0866c",
1703
+ "size_bytes": 14614
1694
1704
  },
1695
1705
  {
1696
1706
  "path": "src/commands/task/migrate-doc.ts",
1697
- "sha256": "04feaa4650b3bc50f4be1579753c6edc7d2b4145679fca91124b9729e39dc56b",
1698
- "size_bytes": 11503
1707
+ "sha256": "74217cbbf2073bc4be293d3ddab2e1dc0f6a6c8998fd8f0805b568781bf0a00e",
1708
+ "size_bytes": 12115
1699
1709
  },
1700
1710
  {
1701
1711
  "path": "src/commands/task/migrate.command.ts",
@@ -1974,8 +1984,8 @@
1974
1984
  },
1975
1985
  {
1976
1986
  "path": "src/commands/upgrade.json-merge.stability.test.ts",
1977
- "sha256": "01ff351bf152119f11dcb2885ff80a268974efaaa70e8df749f5150f6cecd94b",
1978
- "size_bytes": 2179
1987
+ "sha256": "f4cb3c324c862b83f2406efc15338dea14c1fca3888aadf9418a4b79445dad65",
1988
+ "size_bytes": 2282
1979
1989
  },
1980
1990
  {
1981
1991
  "path": "src/commands/upgrade.merge.test.ts",
@@ -2004,8 +2014,8 @@
2004
2014
  },
2005
2015
  {
2006
2016
  "path": "src/commands/upgrade.ts",
2007
- "sha256": "e043d9c5d820a33f8190c5e0460064c23e00753c37dbd83392013faf82eebeb3",
2008
- "size_bytes": 27659
2017
+ "sha256": "322279fc7b791d8bd9aca1fbc350af5cb516f326e00f32d9e8547da42f2f0ecb",
2018
+ "size_bytes": 28709
2009
2019
  },
2010
2020
  {
2011
2021
  "path": "src/commands/upgrade.unit.test.ts",
@@ -2049,8 +2059,8 @@
2049
2059
  },
2050
2060
  {
2051
2061
  "path": "src/commands/workflow-build.command.ts",
2052
- "sha256": "f945951f012df0058316d4fc4827e28a7efcfb029f5ba48aafea57eea826eb79",
2053
- "size_bytes": 4268
2062
+ "sha256": "9e3d0af31e3ea2c971c1ef466d0ac6add3d29e3064c0d4bc78d19e830458808f",
2063
+ "size_bytes": 4233
2054
2064
  },
2055
2065
  {
2056
2066
  "path": "src/commands/workflow-playbook.command.ts",
@@ -2249,8 +2259,8 @@
2249
2259
  },
2250
2260
  {
2251
2261
  "path": "src/ports/task-backend-port.ts",
2252
- "sha256": "c6f863fa4193c1a37639ce5f5186700c8c3cdd63dc43e9a73ba3aa65211706d0",
2253
- "size_bytes": 274
2262
+ "sha256": "ab0830696cd8b97bc9daedbbd63650a668ee615597b8dc2628a69cd8feda7fd9",
2263
+ "size_bytes": 283
2254
2264
  },
2255
2265
  {
2256
2266
  "path": "src/recipes/bundled-recipes.ts",
@@ -2377,6 +2387,11 @@
2377
2387
  "sha256": "b5641bcab785b677b9bfe9d86bb2a553c226ee7c93529b31bd425850a040ff15",
2378
2388
  "size_bytes": 1130
2379
2389
  },
2390
+ {
2391
+ "path": "src/shared/workflow-artifacts.ts",
2392
+ "sha256": "3d61fb748def0a909cf933bc14d2c8e2b4c3365b92a032d6ddb4fbdf387e217d",
2393
+ "size_bytes": 3939
2394
+ },
2380
2395
  {
2381
2396
  "path": "src/shared/write-if-changed.test.ts",
2382
2397
  "sha256": "a6673567b64c987c19fcf00497f0635ffdfb1dd22a951426e430a878a618b49a",
@@ -7,6 +7,6 @@ export declare class TaskBackendAdapter implements TaskBackendPort {
7
7
  listTasks(): Promise<TaskData[]>;
8
8
  getTask(id: string): Promise<TaskData | null>;
9
9
  writeTask(task: TaskData): Promise<void>;
10
- exportTasksJson(path: string): Promise<void>;
10
+ exportProjectionSnapshot(path: string): Promise<void>;
11
11
  }
12
12
  //# sourceMappingURL=task-backend-adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"task-backend-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/task-backend/task-backend-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAE5E,qBAAa,kBAAmB,YAAW,eAAe;IACxD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiB;gBAEzB,GAAG,EAAE,cAAc;IAI/B,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAIhC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAI7C,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAO7C"}
1
+ {"version":3,"file":"task-backend-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/task-backend/task-backend-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAE5E,qBAAa,kBAAmB,YAAW,eAAe;IACxD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiB;gBAEzB,GAAG,EAAE,cAAc;IAI/B,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAIhC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAI7C,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAUtD"}
@@ -12,10 +12,13 @@ export class TaskBackendAdapter {
12
12
  writeTask(task) {
13
13
  return this.ctx.taskBackend.writeTask(task);
14
14
  }
15
- exportTasksJson(path) {
15
+ exportProjectionSnapshot(path) {
16
16
  const backend = this.ctx.taskBackend;
17
+ if (backend.exportProjectionSnapshot) {
18
+ return backend.exportProjectionSnapshot(path);
19
+ }
17
20
  if (!backend.exportTasksJson) {
18
- throw new Error("Backend does not support exportTasksJson");
21
+ throw new Error("Backend does not support exportProjectionSnapshot");
19
22
  }
20
23
  return backend.exportTasksJson(path);
21
24
  }
@@ -1,6 +1,17 @@
1
1
  import { type TaskBackend, type TaskData } from "./shared.js";
2
2
  export declare class LocalBackend implements TaskBackend {
3
3
  id: string;
4
+ capabilities: {
5
+ readonly canonical_source: "local";
6
+ readonly projection: "canonical";
7
+ readonly reads_from_projection_by_default: true;
8
+ readonly writes_task_readmes: true;
9
+ readonly may_access_network_on_read: false;
10
+ readonly may_access_network_on_write: false;
11
+ readonly supports_projection_refresh: false;
12
+ readonly supports_push_sync: false;
13
+ readonly supports_snapshot_export: true;
14
+ };
4
15
  root: string;
5
16
  updatedBy: string;
6
17
  private lastListWarnings;
@@ -13,6 +24,7 @@ export declare class LocalBackend implements TaskBackend {
13
24
  attempts: number;
14
25
  }): Promise<string>;
15
26
  listTasks(): Promise<TaskData[]>;
27
+ listProjectionTasks(): Promise<TaskData[]>;
16
28
  getLastListWarnings(): string[];
17
29
  getTask(taskId: string): Promise<TaskData | null>;
18
30
  getTasks(taskIds: string[]): Promise<(TaskData | null)[]>;
@@ -26,5 +38,6 @@ export declare class LocalBackend implements TaskBackend {
26
38
  changed: number;
27
39
  }>;
28
40
  exportTasksJson(outputPath: string): Promise<void>;
41
+ exportProjectionSnapshot(outputPath: string): Promise<void>;
29
42
  }
30
43
  //# sourceMappingURL=local-backend.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"local-backend.d.ts","sourceRoot":"","sources":["../../../src/backends/task-backend/local-backend.ts"],"names":[],"mappings":"AAqBA,OAAO,EAiBL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACd,MAAM,aAAa,CAAC;AAErB,qBAAa,YAAa,YAAW,WAAW;IAC9C,EAAE,SAAW;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,gBAAgB,CAAgB;gBAE5B,QAAQ,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;IAKrD,cAAc,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB3E,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAwHtC,mBAAmB,IAAI,MAAM,EAAE;IAIzB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAoBjD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC;IAKzD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO3C,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAyExC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB1E,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBvE,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,cAAc,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAuF/D,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIzD"}
1
+ {"version":3,"file":"local-backend.d.ts","sourceRoot":"","sources":["../../../src/backends/task-backend/local-backend.ts"],"names":[],"mappings":"AAqBA,OAAO,EAiBL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACd,MAAM,aAAa,CAAC;AAErB,qBAAa,YAAa,YAAW,WAAW;IAC9C,EAAE,SAAW;IACb,YAAY;;;;;;;;;;MAUD;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,gBAAgB,CAAgB;gBAE5B,QAAQ,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;IAKrD,cAAc,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB3E,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAwHhC,mBAAmB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAIhD,mBAAmB,IAAI,MAAM,EAAE;IAIzB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAoBjD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC;IAKzD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO3C,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAyExC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB1E,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBvE,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,cAAc,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAuF/D,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlD,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGlE"}
@@ -7,6 +7,17 @@ import { buildTaskIndexEntry, loadTaskIndex, resolveTaskIndexPath, saveTaskIndex
7
7
  import { DEFAULT_DOC_UPDATED_BY, defaultPlanApproval, defaultVerificationResult, extractTaskDoc, generateTaskId, invalidLengthMessage, mapLimit, mergeTaskDoc, missingTaskIdMessage, normalizeDocVersion, nowIso, resolveDocUpdatedByFromFrontmatter, resolveDocUpdatedByFromTask, taskRecordToData, validateTaskId, writeTasksExportFromTasks, } from "./shared.js";
8
8
  export class LocalBackend {
9
9
  id = "local";
10
+ capabilities = {
11
+ canonical_source: "local",
12
+ projection: "canonical",
13
+ reads_from_projection_by_default: true,
14
+ writes_task_readmes: true,
15
+ may_access_network_on_read: false,
16
+ may_access_network_on_write: false,
17
+ supports_projection_refresh: false,
18
+ supports_push_sync: false,
19
+ supports_snapshot_export: true,
20
+ };
10
21
  root;
11
22
  updatedBy;
12
23
  lastListWarnings = [];
@@ -151,6 +162,9 @@ export class LocalBackend {
151
162
  this.lastListWarnings = warnings;
152
163
  return tasks;
153
164
  }
165
+ async listProjectionTasks() {
166
+ return await this.listTasks();
167
+ }
154
168
  getLastListWarnings() {
155
169
  return [...this.lastListWarnings];
156
170
  }
@@ -365,4 +379,7 @@ export class LocalBackend {
365
379
  const tasks = await this.listTasks();
366
380
  await writeTasksExportFromTasks({ outputPath, tasks });
367
381
  }
382
+ async exportProjectionSnapshot(outputPath) {
383
+ await this.exportTasksJson(outputPath);
384
+ }
368
385
  }
@@ -13,6 +13,17 @@ export type RedmineSettings = {
13
13
  };
14
14
  export declare class RedmineBackend implements TaskBackend {
15
15
  id: string;
16
+ capabilities: {
17
+ readonly canonical_source: "remote";
18
+ readonly projection: "cache";
19
+ readonly reads_from_projection_by_default: true;
20
+ readonly writes_task_readmes: true;
21
+ readonly may_access_network_on_read: false;
22
+ readonly may_access_network_on_write: true;
23
+ readonly supports_projection_refresh: true;
24
+ readonly supports_push_sync: true;
25
+ readonly supports_snapshot_export: true;
26
+ };
16
27
  baseUrl: string;
17
28
  apiKey: string;
18
29
  projectId: string;
@@ -34,7 +45,14 @@ export declare class RedmineBackend implements TaskBackend {
34
45
  attempts: number;
35
46
  }): Promise<string>;
36
47
  listTasks(): Promise<TaskData[]>;
48
+ listProjectionTasks(): Promise<TaskData[]>;
37
49
  exportTasksJson(outputPath: string): Promise<void>;
50
+ exportProjectionSnapshot(outputPath: string): Promise<void>;
51
+ refreshProjection(opts: {
52
+ allowNetwork: boolean;
53
+ quiet?: boolean;
54
+ conflict?: "diff" | "prefer-local" | "prefer-remote" | "fail";
55
+ }): Promise<void>;
38
56
  normalizeTasks(): Promise<{
39
57
  scanned: number;
40
58
  changed: number;
@@ -1 +1 @@
1
- {"version":3,"file":"redmine-backend.d.ts","sourceRoot":"","sources":["../../../src/backends/task-backend/redmine-backend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"redmine-backend.d.ts","sourceRoot":"","sources":["../../../src/backends/task-backend/redmine-backend.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,17 @@ import { readRedmineEnv } from "./redmine/env.js";
10
10
  import { BackendError, DEFAULT_DOC_UPDATED_BY, DOC_VERSION, RedmineUnavailable, ensureDocMetadata, firstNonEmptyString, generateTaskId, mapLimit, missingTaskIdMessage, normalizeDocVersion, nowIso, redmineConfigMissingEnvMessage, redmineIssueIdMissingMessage, sleep, toStringSafe, unknownTaskIdMessage, validateTaskId, writeTasksExportFromTasks, } from "./shared.js";
11
11
  export class RedmineBackend {
12
12
  id = "redmine";
13
+ capabilities = {
14
+ canonical_source: "remote",
15
+ projection: "cache",
16
+ reads_from_projection_by_default: true,
17
+ writes_task_readmes: true,
18
+ may_access_network_on_read: false,
19
+ may_access_network_on_write: true,
20
+ supports_projection_refresh: true,
21
+ supports_push_sync: true,
22
+ supports_snapshot_export: true,
23
+ };
13
24
  baseUrl;
14
25
  apiKey;
15
26
  projectId;
@@ -89,23 +100,34 @@ export class RedmineBackend {
89
100
  });
90
101
  }
91
102
  async listTasks() {
92
- try {
93
- // Read-only listing must not rewrite local task READMEs through cache updates.
94
- return await this.listTasksRemote();
103
+ if (!this.cache) {
104
+ throw new BackendError("Redmine cache is disabled; projection reads are unavailable", "E_BACKEND");
95
105
  }
96
- catch (err) {
97
- if (err instanceof RedmineUnavailable) {
98
- if (!this.cache)
99
- throw err;
100
- return await this.cache.listTasks();
101
- }
102
- throw err;
106
+ return await this.cache.listTasks();
107
+ }
108
+ async listProjectionTasks() {
109
+ if (!this.cache) {
110
+ throw new BackendError("Redmine cache is disabled; projection reads are unavailable", "E_BACKEND");
103
111
  }
112
+ return await this.cache.listTasks();
104
113
  }
105
114
  async exportTasksJson(outputPath) {
106
115
  const tasks = await this.listTasks();
107
116
  await writeTasksExportFromTasks({ outputPath, tasks });
108
117
  }
118
+ async exportProjectionSnapshot(outputPath) {
119
+ if (!this.cache) {
120
+ throw new BackendError("Redmine cache is disabled; projection snapshot export is unavailable", "E_BACKEND");
121
+ }
122
+ const tasks = await this.cache.listTasks();
123
+ await writeTasksExportFromTasks({ outputPath, tasks });
124
+ }
125
+ async refreshProjection(opts) {
126
+ if (!opts.allowNetwork) {
127
+ throw new BackendError("Projection refresh requires network access approval", "E_BACKEND");
128
+ }
129
+ await this.syncPull(opts.conflict ?? "prefer-remote", opts.quiet ?? true);
130
+ }
109
131
  async normalizeTasks() {
110
132
  // Remote backends should avoid expensive downloads; best-effort normalize the local cache if present.
111
133
  if (this.cache?.normalizeTasks)
@@ -113,22 +135,10 @@ export class RedmineBackend {
113
135
  return { scanned: 0, changed: 0 };
114
136
  }
115
137
  async getTask(taskId) {
116
- try {
117
- const issue = await this.findIssueByTaskId(taskId);
118
- if (!issue)
119
- return null;
120
- // Read-only fetch must not rewrite local task READMEs through cache updates.
121
- return this.issueToTask(issue, taskId);
122
- }
123
- catch (err) {
124
- if (err instanceof RedmineUnavailable) {
125
- if (!this.cache)
126
- throw err;
127
- const cached = await this.cache.getTask(taskId);
128
- return cached ?? null;
129
- }
130
- throw err;
138
+ if (!this.cache) {
139
+ throw new BackendError("Redmine cache is disabled; projection reads are unavailable", "E_BACKEND");
131
140
  }
141
+ return (await this.cache.getTask(taskId)) ?? null;
132
142
  }
133
143
  async getTasks(taskIds) {
134
144
  // Use limited parallelism to avoid hammering the Redmine API.