agentplane 0.3.4 → 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.
- package/dist/.build-manifest.json +60 -50
- package/dist/adapters/task-backend/task-backend-adapter.d.ts +1 -1
- package/dist/adapters/task-backend/task-backend-adapter.d.ts.map +1 -1
- package/dist/adapters/task-backend/task-backend-adapter.js +5 -2
- package/dist/backends/task-backend/local-backend.d.ts +13 -0
- package/dist/backends/task-backend/local-backend.d.ts.map +1 -1
- package/dist/backends/task-backend/local-backend.js +17 -0
- package/dist/backends/task-backend/redmine-backend.d.ts +18 -0
- package/dist/backends/task-backend/redmine-backend.d.ts.map +1 -1
- package/dist/backends/task-backend/redmine-backend.js +35 -25
- package/dist/backends/task-backend/shared/types.d.ts +20 -0
- package/dist/backends/task-backend/shared/types.d.ts.map +1 -1
- package/dist/backends/task-backend/shared.d.ts +1 -1
- package/dist/backends/task-backend/shared.d.ts.map +1 -1
- package/dist/backends/task-backend.d.ts +1 -1
- package/dist/backends/task-backend.d.ts.map +1 -1
- package/dist/commands/doctor/workspace.d.ts +4 -1
- package/dist/commands/doctor/workspace.d.ts.map +1 -1
- package/dist/commands/doctor/workspace.js +87 -4
- package/dist/commands/doctor.run.d.ts.map +1 -1
- package/dist/commands/doctor.run.js +8 -1
- package/dist/commands/shared/git-context.d.ts +1 -0
- package/dist/commands/shared/git-context.d.ts.map +1 -1
- package/dist/commands/shared/git-context.js +4 -0
- package/dist/commands/shared/task-backend.d.ts +5 -0
- package/dist/commands/shared/task-backend.d.ts.map +1 -1
- package/dist/commands/shared/task-backend.js +24 -0
- package/dist/commands/task/export.d.ts.map +1 -1
- package/dist/commands/task/export.js +4 -4
- package/dist/commands/task/finish.d.ts.map +1 -1
- package/dist/commands/task/finish.js +3 -2
- package/dist/commands/task/migrate-doc.d.ts.map +1 -1
- package/dist/commands/task/migrate-doc.js +13 -3
- package/dist/ports/task-backend-port.d.ts +1 -1
- package/dist/ports/task-backend-port.d.ts.map +1 -1
- 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-
|
|
5
|
-
"git_head": "
|
|
6
|
-
"src_cli_mtime_ms":
|
|
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":
|
|
8
|
+
"dist_cli_mtime_ms": 1773055620787.9597,
|
|
9
9
|
"dist_index_mtime_ms": null,
|
|
10
|
-
"tsbuildinfo_mtime_ms":
|
|
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": "
|
|
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": "
|
|
63
|
-
"size_bytes":
|
|
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": "
|
|
88
|
-
"size_bytes":
|
|
87
|
+
"sha256": "7995d304c2b494e69a80cb5f1d2ba5c26686d2aeebdca163187ca04b1f426059",
|
|
88
|
+
"size_bytes": 77948
|
|
89
89
|
},
|
|
90
90
|
{
|
|
91
91
|
"path": "src/backends/task-backend.ts",
|
|
92
|
-
"sha256": "
|
|
93
|
-
"size_bytes":
|
|
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": "
|
|
103
|
-
"size_bytes":
|
|
102
|
+
"sha256": "4d2adf9517bd8e791a2f0993b90f4755f9d221d53eae6a85dc67477f8832d4bc",
|
|
103
|
+
"size_bytes": 15922
|
|
104
104
|
},
|
|
105
105
|
{
|
|
106
106
|
"path": "src/backends/task-backend/redmine-backend.ts",
|
|
107
|
-
"sha256": "
|
|
108
|
-
"size_bytes":
|
|
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": "
|
|
153
|
-
"size_bytes":
|
|
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": "
|
|
208
|
-
"size_bytes":
|
|
212
|
+
"sha256": "6e7ee2be6a314c92fab96630dea044eac767710d0089dbc38e2f3e9c5bdb44c3",
|
|
213
|
+
"size_bytes": 3070
|
|
209
214
|
},
|
|
210
215
|
{
|
|
211
216
|
"path": "src/backends/task-index.ts",
|
|
@@ -349,8 +354,8 @@
|
|
|
349
354
|
},
|
|
350
355
|
{
|
|
351
356
|
"path": "src/cli/local-ci-selection.test.ts",
|
|
352
|
-
"sha256": "
|
|
353
|
-
"size_bytes":
|
|
357
|
+
"sha256": "a32dd8188e3410037b1cbe31a307be645110249e255c3c32a783397da054104a",
|
|
358
|
+
"size_bytes": 8783
|
|
354
359
|
},
|
|
355
360
|
{
|
|
356
361
|
"path": "src/cli/output.test.ts",
|
|
@@ -459,8 +464,8 @@
|
|
|
459
464
|
},
|
|
460
465
|
{
|
|
461
466
|
"path": "src/cli/run-cli.core.tasks.test.ts",
|
|
462
|
-
"sha256": "
|
|
463
|
-
"size_bytes":
|
|
467
|
+
"sha256": "409ca8844e6439bd731f0573b49664ff49a7937f1635f7dfb0bbe783db1e42e3",
|
|
468
|
+
"size_bytes": 75281
|
|
464
469
|
},
|
|
465
470
|
{
|
|
466
471
|
"path": "src/cli/run-cli.core.test.ts",
|
|
@@ -854,8 +859,8 @@
|
|
|
854
859
|
},
|
|
855
860
|
{
|
|
856
861
|
"path": "src/commands/doctor.command.test.ts",
|
|
857
|
-
"sha256": "
|
|
858
|
-
"size_bytes":
|
|
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": "
|
|
873
|
-
"size_bytes":
|
|
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": "
|
|
908
|
-
"size_bytes":
|
|
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": "
|
|
1343
|
-
"size_bytes":
|
|
1347
|
+
"sha256": "bfcb939cdefbc0e0bc30f4c38140736589ca9a1da40ba7d6b477474b601f7a93",
|
|
1348
|
+
"size_bytes": 27438
|
|
1344
1349
|
},
|
|
1345
1350
|
{
|
|
1346
1351
|
"path": "src/commands/release/apply.types.ts",
|
|
@@ -1439,13 +1444,13 @@
|
|
|
1439
1444
|
},
|
|
1440
1445
|
{
|
|
1441
1446
|
"path": "src/commands/shared/git-context.test.ts",
|
|
1442
|
-
"sha256": "
|
|
1443
|
-
"size_bytes":
|
|
1447
|
+
"sha256": "4dfafb9bdb4d57ad4671bf28553a69575427248de7bdc06b1a495647a4e81f8b",
|
|
1448
|
+
"size_bytes": 3047
|
|
1444
1449
|
},
|
|
1445
1450
|
{
|
|
1446
1451
|
"path": "src/commands/shared/git-context.ts",
|
|
1447
|
-
"sha256": "
|
|
1448
|
-
"size_bytes":
|
|
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": "
|
|
1518
|
-
"size_bytes":
|
|
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": "
|
|
1638
|
-
"size_bytes":
|
|
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": "
|
|
1643
|
-
"size_bytes":
|
|
1652
|
+
"sha256": "946d09b225659ce3b14321748a02fb6efe60263ee85a2ac1611778373aa4c587",
|
|
1653
|
+
"size_bytes": 16076
|
|
1644
1654
|
},
|
|
1645
1655
|
{
|
|
1646
1656
|
"path": "src/commands/task/finish.unit.test.ts",
|
|
1647
|
-
"sha256": "
|
|
1648
|
-
"size_bytes":
|
|
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": "
|
|
1693
|
-
"size_bytes":
|
|
1702
|
+
"sha256": "41cbc75077261ecb891c22bc8ad31b6d1dee7d039c4a1b32703c1bb766a0866c",
|
|
1703
|
+
"size_bytes": 14614
|
|
1694
1704
|
},
|
|
1695
1705
|
{
|
|
1696
1706
|
"path": "src/commands/task/migrate-doc.ts",
|
|
1697
|
-
"sha256": "
|
|
1698
|
-
"size_bytes":
|
|
1707
|
+
"sha256": "74217cbbf2073bc4be293d3ddab2e1dc0f6a6c8998fd8f0805b568781bf0a00e",
|
|
1708
|
+
"size_bytes": 12115
|
|
1699
1709
|
},
|
|
1700
1710
|
{
|
|
1701
1711
|
"path": "src/commands/task/migrate.command.ts",
|
|
@@ -2249,8 +2259,8 @@
|
|
|
2249
2259
|
},
|
|
2250
2260
|
{
|
|
2251
2261
|
"path": "src/ports/task-backend-port.ts",
|
|
2252
|
-
"sha256": "
|
|
2253
|
-
"size_bytes":
|
|
2262
|
+
"sha256": "ab0830696cd8b97bc9daedbbd63650a668ee615597b8dc2628a69cd8feda7fd9",
|
|
2263
|
+
"size_bytes": 283
|
|
2254
2264
|
},
|
|
2255
2265
|
{
|
|
2256
2266
|
"path": "src/recipes/bundled-recipes.ts",
|
|
@@ -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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
|
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;
|
|
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":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA2BvD,OAAO,EAmBL,KAAK,WAAW,EAChB,KAAK,QAAQ,EAEd,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,qBAAa,cAAe,YAAW,WAAW;IAChD,EAAE,SAAa;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,UAAU,uCAA8C;IACxD,aAAa,sBAA6B;IAC1C,0BAA0B,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAQ;gBAElD,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE;QAAE,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI,CAAA;KAAE;IA8CtE,cAAc,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAoB3E,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;
|
|
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
|
-
|
|
93
|
-
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
117
|
-
|
|
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.
|
|
@@ -55,9 +55,27 @@ export type TaskData = {
|
|
|
55
55
|
id_source?: string;
|
|
56
56
|
};
|
|
57
57
|
export type TaskDocMeta = Pick<TaskData, "doc" | "doc_version" | "doc_updated_at" | "doc_updated_by">;
|
|
58
|
+
export type TaskBackendCapabilities = {
|
|
59
|
+
canonical_source: "local" | "remote";
|
|
60
|
+
projection: "canonical" | "cache";
|
|
61
|
+
reads_from_projection_by_default: boolean;
|
|
62
|
+
writes_task_readmes?: boolean;
|
|
63
|
+
may_access_network_on_read: boolean;
|
|
64
|
+
may_access_network_on_write: boolean;
|
|
65
|
+
supports_projection_refresh: boolean;
|
|
66
|
+
supports_push_sync: boolean;
|
|
67
|
+
supports_snapshot_export: boolean;
|
|
68
|
+
};
|
|
69
|
+
export type TaskProjectionRefreshOptions = {
|
|
70
|
+
allowNetwork: boolean;
|
|
71
|
+
quiet?: boolean;
|
|
72
|
+
conflict?: "diff" | "prefer-local" | "prefer-remote" | "fail";
|
|
73
|
+
};
|
|
58
74
|
export type TaskBackend = {
|
|
59
75
|
id: string;
|
|
76
|
+
capabilities: TaskBackendCapabilities;
|
|
60
77
|
listTasks(): Promise<TaskData[]>;
|
|
78
|
+
listProjectionTasks?(): Promise<TaskData[]>;
|
|
61
79
|
getLastListWarnings?(): string[];
|
|
62
80
|
getTask(taskId: string): Promise<TaskData | null>;
|
|
63
81
|
getTasks?(taskIds: string[]): Promise<(TaskData | null)[]>;
|
|
@@ -67,6 +85,8 @@ export type TaskBackend = {
|
|
|
67
85
|
scanned: number;
|
|
68
86
|
changed: number;
|
|
69
87
|
}>;
|
|
88
|
+
refreshProjection?(opts: TaskProjectionRefreshOptions): Promise<void>;
|
|
89
|
+
exportProjectionSnapshot?(outputPath: string): Promise<void>;
|
|
70
90
|
exportTasksJson?(outputPath: string): Promise<void>;
|
|
71
91
|
getTaskDoc?(taskId: string): Promise<string>;
|
|
72
92
|
setTaskDoc?(taskId: string, doc: string, updatedBy?: string): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/backends/task-backend/shared/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/backends/task-backend/shared/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { DEFAULT_DOC_UPDATED_BY, DOC_VERSION, TASK_ID_RE } from "./shared/constants.js";
|
|
2
|
-
export type { PlanApproval, PlanApprovalState, TaskBackend, TaskData, TaskDocMeta, TaskEvent, TaskEventType, VerificationResult, VerificationState, } from "./shared/types.js";
|
|
2
|
+
export type { PlanApproval, PlanApprovalState, TaskBackend, TaskBackendCapabilities, TaskData, TaskDocMeta, TaskEvent, TaskEventType, TaskProjectionRefreshOptions, VerificationResult, VerificationState, } from "./shared/types.js";
|
|
3
3
|
export * from "./shared/concurrency.js";
|
|
4
4
|
export * from "./shared/doc.js";
|
|
5
5
|
export * from "./shared/errors.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/backends/task-backend/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExF,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,QAAQ,EACR,WAAW,EACX,SAAS,EACT,aAAa,EACb,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/backends/task-backend/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExF,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,uBAAuB,EACvB,QAAQ,EACR,WAAW,EACX,SAAS,EACT,aAAa,EACb,4BAA4B,EAC5B,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { BackendError, RedmineUnavailable, buildTasksExportSnapshotFromTasks, extractTaskDoc, mergeTaskDoc, taskRecordToData, writeTasksExportFromTasks, type PlanApproval, type PlanApprovalState, type TaskBackend, type TaskData, type TaskEvent, type TaskEventType, type VerificationResult, type VerificationState, } from "./task-backend/shared.js";
|
|
1
|
+
export { BackendError, RedmineUnavailable, buildTasksExportSnapshotFromTasks, extractTaskDoc, mergeTaskDoc, taskRecordToData, writeTasksExportFromTasks, type PlanApproval, type PlanApprovalState, type TaskBackend, type TaskBackendCapabilities, type TaskData, type TaskEvent, type TaskEventType, type TaskProjectionRefreshOptions, type VerificationResult, type VerificationState, } from "./task-backend/shared.js";
|
|
2
2
|
export { LocalBackend } from "./task-backend/local-backend.js";
|
|
3
3
|
export { RedmineBackend } from "./task-backend/redmine-backend.js";
|
|
4
4
|
export { loadTaskBackend } from "./task-backend/load.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-backend.d.ts","sourceRoot":"","sources":["../../src/backends/task-backend.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,iCAAiC,EACjC,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,yBAAyB,EACzB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"task-backend.d.ts","sourceRoot":"","sources":["../../src/backends/task-backend.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,iCAAiC,EACjC,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,yBAAyB,EACzB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,uBAAuB,EAC5B,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,4BAA4B,EACjC,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { type CommandContext } from "../shared/task-backend.js";
|
|
2
|
+
export declare function checkWorkspace(repoRoot: string, opts?: {
|
|
3
|
+
ctx?: CommandContext;
|
|
4
|
+
}): Promise<string[]>;
|
|
2
5
|
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/workspace.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/workspace.ts"],"names":[],"mappings":"AAQA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AA6NpF,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,cAAc,CAAA;CAAE,GAC9B,OAAO,CAAC,MAAM,EAAE,CAAC,CAyDnB"}
|
|
@@ -3,6 +3,8 @@ import path from "node:path";
|
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { renderDiagnosticFinding } from "../../shared/diagnostics.js";
|
|
5
5
|
import { resolvePolicyGatewayForRepo } from "../../shared/policy-gateway.js";
|
|
6
|
+
import { GitContext } from "../shared/git-context.js";
|
|
7
|
+
import { listTaskProjection } from "../shared/task-backend.js";
|
|
6
8
|
async function pathExists(absPath) {
|
|
7
9
|
try {
|
|
8
10
|
await fs.access(absPath);
|
|
@@ -44,7 +46,14 @@ async function listMissingManagedPolicyFiles(repoRoot) {
|
|
|
44
46
|
}
|
|
45
47
|
return missing.toSorted();
|
|
46
48
|
}
|
|
47
|
-
|
|
49
|
+
function taskDataToSnapshot(task) {
|
|
50
|
+
return {
|
|
51
|
+
id: task.id,
|
|
52
|
+
status: task.status,
|
|
53
|
+
doc_version: task.doc_version,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
async function readTaskDocSnapshotsFromTasksJson(repoRoot) {
|
|
48
57
|
const tasksPath = path.join(repoRoot, ".agentplane", "tasks.json");
|
|
49
58
|
let raw = "";
|
|
50
59
|
try {
|
|
@@ -60,7 +69,22 @@ async function checkTaskReadmeMigrationState(repoRoot) {
|
|
|
60
69
|
catch {
|
|
61
70
|
return [];
|
|
62
71
|
}
|
|
63
|
-
|
|
72
|
+
return Array.isArray(parsed.tasks) ? parsed.tasks : [];
|
|
73
|
+
}
|
|
74
|
+
async function readTaskDocSnapshotsFromProjection(ctx) {
|
|
75
|
+
if (!ctx)
|
|
76
|
+
return null;
|
|
77
|
+
try {
|
|
78
|
+
const tasks = await listTaskProjection(ctx);
|
|
79
|
+
if (tasks === null)
|
|
80
|
+
return null;
|
|
81
|
+
return tasks.map((task) => taskDataToSnapshot(task));
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function buildTaskReadmeMigrationFindings(tasks) {
|
|
64
88
|
if (tasks.length === 0)
|
|
65
89
|
return [];
|
|
66
90
|
const legacy = tasks.filter((task) => task.doc_version !== 3);
|
|
@@ -114,7 +138,66 @@ async function checkTaskReadmeMigrationState(repoRoot) {
|
|
|
114
138
|
}),
|
|
115
139
|
];
|
|
116
140
|
}
|
|
117
|
-
|
|
141
|
+
async function checkTaskReadmeMigrationState(repoRoot, ctx) {
|
|
142
|
+
const projectionTasks = await readTaskDocSnapshotsFromProjection(ctx);
|
|
143
|
+
const tasks = projectionTasks && projectionTasks.length > 0
|
|
144
|
+
? projectionTasks
|
|
145
|
+
: await readTaskDocSnapshotsFromTasksJson(repoRoot);
|
|
146
|
+
return buildTaskReadmeMigrationFindings(tasks);
|
|
147
|
+
}
|
|
148
|
+
async function readUntrackedPaths(repoRoot, ctx) {
|
|
149
|
+
try {
|
|
150
|
+
const git = ctx?.git ?? new GitContext({ gitRoot: repoRoot });
|
|
151
|
+
return new Set(await git.statusUntrackedPaths());
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return new Set();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async function checkDoneTaskReadmeArchiveDrift(repoRoot, ctx) {
|
|
158
|
+
const projectionTasks = await readTaskDocSnapshotsFromProjection(ctx);
|
|
159
|
+
const tasks = projectionTasks && projectionTasks.length > 0
|
|
160
|
+
? projectionTasks
|
|
161
|
+
: await readTaskDocSnapshotsFromTasksJson(repoRoot);
|
|
162
|
+
if (tasks.length === 0)
|
|
163
|
+
return [];
|
|
164
|
+
const workflowDir = (ctx?.config.paths.workflow_dir ?? ".agentplane/tasks").replaceAll("\\", "/");
|
|
165
|
+
const untracked = await readUntrackedPaths(repoRoot, ctx);
|
|
166
|
+
if (untracked.size === 0)
|
|
167
|
+
return [];
|
|
168
|
+
const affected = tasks
|
|
169
|
+
.filter((task) => {
|
|
170
|
+
const status = typeof task.status === "string" ? task.status.trim().toUpperCase() : "";
|
|
171
|
+
const taskId = typeof task.id === "string" ? task.id.trim() : "";
|
|
172
|
+
if (status !== "DONE" || !taskId)
|
|
173
|
+
return false;
|
|
174
|
+
return untracked.has(`${workflowDir}/${taskId}/README.md`);
|
|
175
|
+
})
|
|
176
|
+
.map((task) => String(task.id))
|
|
177
|
+
.toSorted();
|
|
178
|
+
if (affected.length === 0)
|
|
179
|
+
return [];
|
|
180
|
+
const examples = affected.slice(0, 5).join(", ");
|
|
181
|
+
const stagedCommand = `git add ${affected
|
|
182
|
+
.map((taskId) => `${workflowDir}/${taskId}/README.md`)
|
|
183
|
+
.join(" ")}`;
|
|
184
|
+
return [
|
|
185
|
+
renderDiagnosticFinding({
|
|
186
|
+
severity: "WARN",
|
|
187
|
+
state: "DONE task archive README files exist on disk but are missing from the git index",
|
|
188
|
+
likelyCause: "task metadata reached DONE state, but the human-readable task README archive never landed in a tracked close commit",
|
|
189
|
+
nextAction: {
|
|
190
|
+
command: stagedCommand,
|
|
191
|
+
reason: "stage the missing archived task README files and commit them before continuing",
|
|
192
|
+
},
|
|
193
|
+
details: [
|
|
194
|
+
`Affected DONE tasks: ${affected.length}`,
|
|
195
|
+
examples ? `Examples: ${examples}` : "Examples unavailable.",
|
|
196
|
+
],
|
|
197
|
+
}),
|
|
198
|
+
];
|
|
199
|
+
}
|
|
200
|
+
export async function checkWorkspace(repoRoot, opts) {
|
|
118
201
|
const problems = [];
|
|
119
202
|
const requiredFiles = [path.join(repoRoot, ".agentplane", "config.json")];
|
|
120
203
|
for (const filePath of requiredFiles) {
|
|
@@ -160,6 +243,6 @@ export async function checkWorkspace(repoRoot) {
|
|
|
160
243
|
if (!hasJson) {
|
|
161
244
|
problems.push("No agent profiles found in .agentplane/agents (*.json expected).");
|
|
162
245
|
}
|
|
163
|
-
problems.push(...(await checkTaskReadmeMigrationState(repoRoot)));
|
|
246
|
+
problems.push(...(await checkTaskReadmeMigrationState(repoRoot, opts?.ctx)), ...(await checkDoneTaskReadmeArchiveDrift(repoRoot, opts?.ctx)));
|
|
164
247
|
return problems;
|
|
165
248
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.run.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.run.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.run.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.run.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAarD,eAAO,MAAM,SAAS,EAAE,cAAc,CAAC,YAAY,CA6DlD,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { loadConfig, resolveProject } from "@agentplaneorg/core";
|
|
2
2
|
import { warnMessage, successMessage } from "../cli/output.js";
|
|
3
|
+
import { loadCommandContext } from "./shared/task-backend.js";
|
|
3
4
|
import { checkDoneTaskCommitInvariants } from "./doctor/archive.js";
|
|
4
5
|
import { safeFixGitignore, safeFixTaskIndex } from "./doctor/fixes.js";
|
|
5
6
|
import { checkLayering } from "./doctor/layering.js";
|
|
@@ -11,9 +12,15 @@ export const runDoctor = async (ctx, p) => {
|
|
|
11
12
|
const resolved = await resolveProject({ cwd: ctx.cwd, rootOverride: ctx.rootOverride ?? null });
|
|
12
13
|
const repoRoot = resolved.gitRoot;
|
|
13
14
|
const loadedConfig = await loadConfig(resolved.agentplaneDir);
|
|
15
|
+
const commandCtx = await loadCommandContext({
|
|
16
|
+
cwd: ctx.cwd,
|
|
17
|
+
rootOverride: ctx.rootOverride ?? null,
|
|
18
|
+
resolvedProject: resolved,
|
|
19
|
+
config: loadedConfig.config,
|
|
20
|
+
});
|
|
14
21
|
const runChecks = async () => {
|
|
15
22
|
let checks = [
|
|
16
|
-
...(await checkWorkspace(repoRoot)),
|
|
23
|
+
...(await checkWorkspace(repoRoot, { ctx: commandCtx })),
|
|
17
24
|
...checkRuntimeSourceFacts(ctx.cwd, loadedConfig.config),
|
|
18
25
|
...(await checkDoneTaskCommitInvariants(repoRoot, { fullArchive: p.archiveFull })),
|
|
19
26
|
];
|
|
@@ -7,6 +7,7 @@ export declare class GitContext {
|
|
|
7
7
|
private statusPorcelainZ;
|
|
8
8
|
statusChangedPaths(): Promise<string[]>;
|
|
9
9
|
statusStagedPaths(): Promise<string[]>;
|
|
10
|
+
statusUntrackedPaths(): Promise<string[]>;
|
|
10
11
|
statusUnstagedTrackedPaths(): Promise<string[]>;
|
|
11
12
|
headCommit(): Promise<string>;
|
|
12
13
|
stage(paths: string[]): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-context.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/git-context.ts"],"names":[],"mappings":"AAyEA,qBAAa,UAAU;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,OAAO,CAAC,IAAI,CAGL;gBAEK,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;YAIvB,gBAAgB;IAmBxB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKvC,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKtC,0BAA0B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKrD,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAWvB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxF,iBAAiB,CAAC,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpE,eAAe,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAWpE"}
|
|
1
|
+
{"version":3,"file":"git-context.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/git-context.ts"],"names":[],"mappings":"AAyEA,qBAAa,UAAU;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,OAAO,CAAC,IAAI,CAGL;gBAEK,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;YAIvB,gBAAgB;IAmBxB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKvC,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKtC,oBAAoB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKzC,0BAA0B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKrD,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAWvB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxF,iBAAiB,CAAC,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpE,eAAe,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAWpE"}
|
|
@@ -87,6 +87,10 @@ export class GitContext {
|
|
|
87
87
|
const status = await this.statusPorcelainZ();
|
|
88
88
|
return status.stagedPaths;
|
|
89
89
|
}
|
|
90
|
+
async statusUntrackedPaths() {
|
|
91
|
+
const status = await this.statusPorcelainZ();
|
|
92
|
+
return status.untrackedPaths;
|
|
93
|
+
}
|
|
90
94
|
async statusUnstagedTrackedPaths() {
|
|
91
95
|
const status = await this.statusPorcelainZ();
|
|
92
96
|
return status.unstagedTrackedPaths;
|
|
@@ -44,4 +44,9 @@ export declare function loadBackendTask(opts: {
|
|
|
44
44
|
task: TaskData;
|
|
45
45
|
}>;
|
|
46
46
|
export declare function listTasksMemo(ctx: CommandContext): Promise<TaskData[]>;
|
|
47
|
+
export declare function listTaskProjection(ctx: CommandContext): Promise<TaskData[] | null>;
|
|
48
|
+
export declare function exportTaskProjectionSnapshot(opts: {
|
|
49
|
+
ctx: CommandContext;
|
|
50
|
+
outputPath: string;
|
|
51
|
+
}): Promise<void>;
|
|
47
52
|
//# sourceMappingURL=task-backend.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-backend.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/task-backend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG7E,OAAO,EAAE,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,eAAe,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACzE,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC9D,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,GAAG,EAAE,UAAU,CAAC;IAEhB,IAAI,EAAE,WAAW,CAAC;IAGlB,QAAQ,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAC5C,OAAO,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;CACxC,CAAC;AASF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ3E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA+B7E;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B,GAAG,OAAO,CAAC,cAAc,CAAC,CAmB1B;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAepB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC;IACV,OAAO,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAC5C,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,EAAE,QAAQ,CAAC;CAChB,CAAC,CAaD;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAG5E"}
|
|
1
|
+
{"version":3,"file":"task-backend.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/task-backend.ts"],"names":[],"mappings":"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"}
|
|
@@ -99,3 +99,27 @@ export async function listTasksMemo(ctx) {
|
|
|
99
99
|
ctx.memo.taskList ??= ctx.taskBackend.listTasks();
|
|
100
100
|
return await ctx.memo.taskList;
|
|
101
101
|
}
|
|
102
|
+
export async function listTaskProjection(ctx) {
|
|
103
|
+
if (ctx.taskBackend.listProjectionTasks) {
|
|
104
|
+
return await ctx.taskBackend.listProjectionTasks();
|
|
105
|
+
}
|
|
106
|
+
if (ctx.taskBackend.capabilities.reads_from_projection_by_default) {
|
|
107
|
+
return await listTasksMemo(ctx);
|
|
108
|
+
}
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
export async function exportTaskProjectionSnapshot(opts) {
|
|
112
|
+
if (opts.ctx.taskBackend.exportProjectionSnapshot) {
|
|
113
|
+
await opts.ctx.taskBackend.exportProjectionSnapshot(opts.outputPath);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (opts.ctx.taskBackend.exportTasksJson) {
|
|
117
|
+
await opts.ctx.taskBackend.exportTasksJson(opts.outputPath);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
throw new CliError({
|
|
121
|
+
exitCode: 3,
|
|
122
|
+
code: "E_VALIDATION",
|
|
123
|
+
message: "Configured backend does not support exporting a task snapshot",
|
|
124
|
+
});
|
|
125
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/commands/task/export.ts"],"names":[],"mappings":"AAKA,OAAO,
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/commands/task/export.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAEnC,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBlB"}
|
|
@@ -2,20 +2,20 @@ import path from "node:path";
|
|
|
2
2
|
import { mapBackendError } from "../../cli/error-map.js";
|
|
3
3
|
import { backendNotSupportedMessage } from "../../cli/output.js";
|
|
4
4
|
import { CliError } from "../../shared/errors.js";
|
|
5
|
-
import { loadCommandContext } from "../shared/task-backend.js";
|
|
5
|
+
import { exportTaskProjectionSnapshot, loadCommandContext, } from "../shared/task-backend.js";
|
|
6
6
|
export async function cmdTaskExport(opts) {
|
|
7
7
|
try {
|
|
8
8
|
const ctx = opts.ctx ??
|
|
9
9
|
(await loadCommandContext({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null }));
|
|
10
10
|
const outPath = path.join(ctx.resolvedProject.gitRoot, ctx.config.paths.tasks_path);
|
|
11
|
-
if (!ctx.taskBackend.exportTasksJson) {
|
|
11
|
+
if (!ctx.taskBackend.exportProjectionSnapshot && !ctx.taskBackend.exportTasksJson) {
|
|
12
12
|
throw new CliError({
|
|
13
13
|
exitCode: 3,
|
|
14
14
|
code: "E_VALIDATION",
|
|
15
|
-
message: backendNotSupportedMessage("
|
|
15
|
+
message: backendNotSupportedMessage("exportProjectionSnapshot()"),
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
|
-
await ctx
|
|
18
|
+
await exportTaskProjectionSnapshot({ ctx, outputPath: outPath });
|
|
19
19
|
process.stdout.write(`${path.relative(ctx.resolvedProject.gitRoot, outPath)}\n`);
|
|
20
20
|
return 0;
|
|
21
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"finish.d.ts","sourceRoot":"","sources":["../../../src/commands/task/finish.ts"],"names":[],"mappings":"AAYA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAqCnC,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,wBAAwB,EAAE,OAAO,CAAC;IAClC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"finish.d.ts","sourceRoot":"","sources":["../../../src/commands/task/finish.ts"],"names":[],"mappings":"AAYA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAqCnC,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,wBAAwB,EAAE,OAAO,CAAC;IAClC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4XlB"}
|
|
@@ -114,8 +114,9 @@ export async function cmdFinish(opts) {
|
|
|
114
114
|
: await readHeadCommit(gitRoot);
|
|
115
115
|
const useStore = backendIsLocalFileBackend(ctx);
|
|
116
116
|
const store = useStore ? getTaskStore(ctx) : null;
|
|
117
|
+
const backendWritesTaskReadmes = ctx.taskBackend.capabilities.writes_task_readmes === true;
|
|
117
118
|
const defaultDirectCloseCommit = ctx.config.workflow_mode === "direct" &&
|
|
118
|
-
|
|
119
|
+
backendWritesTaskReadmes &&
|
|
119
120
|
opts.taskIds.length === 1 &&
|
|
120
121
|
!opts.commitFromComment &&
|
|
121
122
|
!statusCommitRequested;
|
|
@@ -275,7 +276,7 @@ export async function cmdFinish(opts) {
|
|
|
275
276
|
await (useStore
|
|
276
277
|
? store.update(primaryTaskId, () => updatedAfterCommit)
|
|
277
278
|
: ctx.taskBackend.writeTask(updatedAfterCommit));
|
|
278
|
-
if (
|
|
279
|
+
if (backendWritesTaskReadmes) {
|
|
279
280
|
const workflowReadmeRelPath = path.join(ctx.config.paths.workflow_dir, primaryTaskId, "README.md");
|
|
280
281
|
await ctx.git.stage([workflowReadmeRelPath]);
|
|
281
282
|
const env = buildGitCommitEnv({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-doc.d.ts","sourceRoot":"","sources":["../../../src/commands/task/migrate-doc.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"migrate-doc.d.ts","sourceRoot":"","sources":["../../../src/commands/task/migrate-doc.ts"],"names":[],"mappings":"AAiSA,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqDlB"}
|
|
@@ -6,11 +6,11 @@ import { exitCodeForError } from "../../cli/exit-codes.js";
|
|
|
6
6
|
import { fileExists, getPathKind } from "../../cli/fs-utils.js";
|
|
7
7
|
import { successMessage } from "../../cli/output.js";
|
|
8
8
|
import { CliError } from "../../shared/errors.js";
|
|
9
|
+
import { exportTaskProjectionSnapshot, loadCommandContext } from "../shared/task-backend.js";
|
|
9
10
|
import { extractDocSection, extractTaskObservationSection, normalizeTaskDocVersion, normalizeVerificationSectionLayout, } from "./shared/docs.js";
|
|
10
11
|
import { defaultTaskDocV3 } from "./doc-template.js";
|
|
11
12
|
const V3_CANONICAL_ORDER = [
|
|
12
13
|
"Summary",
|
|
13
|
-
"Context",
|
|
14
14
|
"Scope",
|
|
15
15
|
"Plan",
|
|
16
16
|
"Verify Steps",
|
|
@@ -98,8 +98,6 @@ function migrateDocToV3(opts) {
|
|
|
98
98
|
const currentText = firstSectionText(currentSections, title);
|
|
99
99
|
const defaultText = firstSectionText(defaultSections, title) ?? "";
|
|
100
100
|
let nextText = currentText ?? defaultText;
|
|
101
|
-
if (title === "Context" && !(currentText ?? "").trim())
|
|
102
|
-
continue;
|
|
103
101
|
if (title === "Verification") {
|
|
104
102
|
nextText = normalizeVerificationSectionLayout(currentText ?? defaultText, 3);
|
|
105
103
|
}
|
|
@@ -242,6 +240,12 @@ export async function cmdTaskMigrateDoc(opts) {
|
|
|
242
240
|
rootOverride: opts.rootOverride ?? null,
|
|
243
241
|
});
|
|
244
242
|
const loaded = await loadConfig(resolved.agentplaneDir);
|
|
243
|
+
const ctx = await loadCommandContext({
|
|
244
|
+
cwd: opts.cwd,
|
|
245
|
+
rootOverride: opts.rootOverride ?? null,
|
|
246
|
+
resolvedProject: resolved,
|
|
247
|
+
config: loaded.config,
|
|
248
|
+
});
|
|
245
249
|
const tasksDir = path.join(resolved.gitRoot, loaded.config.paths.workflow_dir);
|
|
246
250
|
const readmePaths = await resolveReadmePaths({ tasksDir, params });
|
|
247
251
|
if (!params.all) {
|
|
@@ -262,6 +266,12 @@ export async function cmdTaskMigrateDoc(opts) {
|
|
|
262
266
|
if (res.changed)
|
|
263
267
|
changed += 1;
|
|
264
268
|
}
|
|
269
|
+
// Refresh the local export snapshot so doctor and other snapshot-based checks
|
|
270
|
+
// immediately observe the migrated README contract without a separate task export.
|
|
271
|
+
if (ctx.taskBackend.exportProjectionSnapshot || ctx.taskBackend.exportTasksJson) {
|
|
272
|
+
const outPath = path.join(resolved.gitRoot, loaded.config.paths.tasks_path);
|
|
273
|
+
await exportTaskProjectionSnapshot({ ctx, outputPath: outPath });
|
|
274
|
+
}
|
|
265
275
|
if (!params.quiet) {
|
|
266
276
|
process.stdout.write(`${successMessage("migrated task docs", undefined, `changed=${changed}`)}\n`);
|
|
267
277
|
}
|
|
@@ -3,6 +3,6 @@ export type TaskBackendPort = {
|
|
|
3
3
|
listTasks(): Promise<TaskData[]>;
|
|
4
4
|
getTask(id: string): Promise<TaskData | null>;
|
|
5
5
|
writeTask(task: TaskData): Promise<void>;
|
|
6
|
-
|
|
6
|
+
exportProjectionSnapshot(path: string): Promise<void>;
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=task-backend-port.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-backend-port.d.ts","sourceRoot":"","sources":["../../src/ports/task-backend-port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAE5D,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC9C,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,
|
|
1
|
+
{"version":3,"file":"task-backend-port.d.ts","sourceRoot":"","sources":["../../src/ports/task-backend-port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAE5D,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC9C,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentplane",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"description": "Agent Plane CLI for task workflows, recipes, and project automation.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agentplane",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"prepublishOnly": "node ../../scripts/enforce-github-publish.mjs && npm run prepack"
|
|
56
56
|
},
|
|
57
57
|
"dependencies": {
|
|
58
|
-
"@agentplaneorg/core": "0.3.
|
|
58
|
+
"@agentplaneorg/core": "0.3.5",
|
|
59
59
|
"yauzl": "^2.10.0"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|