gsd-pi 2.44.0-dev.848dd4c → 2.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. package/README.md +12 -30
  2. package/dist/resources/extensions/gsd/auto-start.js +0 -10
  3. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +0 -5
  4. package/dist/web/standalone/.next/BUILD_ID +1 -1
  5. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  6. package/dist/web/standalone/.next/build-manifest.json +3 -3
  7. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  8. package/dist/web/standalone/.next/required-server-files.json +3 -3
  9. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  10. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  12. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  13. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  14. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  15. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  16. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  17. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  18. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  19. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  20. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  21. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  22. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  23. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  24. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  25. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  26. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  28. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  30. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  31. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  32. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  33. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  34. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  35. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  36. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  37. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  38. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  39. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  40. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  41. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  42. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  43. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  44. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  45. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  46. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  47. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  48. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  49. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  50. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  51. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  52. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  53. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  54. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  55. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  56. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  57. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  58. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  59. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  60. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  61. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  62. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  63. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  64. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  65. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  66. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  67. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  68. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  69. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  70. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  72. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  74. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  80. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  82. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  94. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  96. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  98. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  100. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/index.html +1 -1
  110. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  111. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  112. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  113. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  115. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/page.js +2 -2
  117. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  119. package/dist/web/standalone/.next/server/chunks/229.js +1 -1
  120. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  121. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/middleware.js +2 -2
  123. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  125. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  126. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  127. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  128. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
  129. package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
  130. package/dist/web/standalone/.next/static/chunks/app/page-7e9530a7122506c5.js +1 -0
  131. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
  132. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
  133. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  134. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  135. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  136. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  137. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  138. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  139. package/dist/web/standalone/server.js +1 -1
  140. package/package.json +1 -1
  141. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +8 -6
  142. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  143. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +26 -24
  144. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  145. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +48 -29
  146. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  147. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +44 -34
  148. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  149. package/packages/pi-coding-agent/dist/core/session-manager.test.js +34 -30
  150. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  151. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +12 -10
  152. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  153. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +47 -43
  154. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  155. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  156. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  157. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +43 -31
  158. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +45 -40
  159. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  160. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  161. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  162. package/src/resources/extensions/gsd/auto-start.ts +0 -14
  163. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +0 -8
  164. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  165. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +16 -14
  166. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +57 -43
  167. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +13 -11
  168. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +523 -465
  169. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +75 -73
  170. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +56 -34
  171. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +656 -533
  172. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +143 -165
  173. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +52 -29
  174. package/src/resources/extensions/gsd/tests/captures.test.ts +176 -148
  175. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +33 -32
  176. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +143 -141
  177. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  178. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  179. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +59 -38
  180. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +263 -228
  181. package/src/resources/extensions/gsd/tests/complete-task.test.ts +302 -250
  182. package/src/resources/extensions/gsd/tests/context-store.test.ts +367 -354
  183. package/src/resources/extensions/gsd/tests/continue-here.test.ts +72 -68
  184. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +106 -92
  185. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +35 -27
  186. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +237 -220
  187. package/src/resources/extensions/gsd/tests/db-writer.test.ts +420 -390
  188. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +92 -76
  189. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +83 -68
  190. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +183 -152
  191. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +101 -78
  192. package/src/resources/extensions/gsd/tests/derive-state.test.ts +227 -192
  193. package/src/resources/extensions/gsd/tests/detection.test.ts +278 -232
  194. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +34 -30
  195. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +180 -164
  196. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +49 -43
  197. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +32 -28
  198. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +29 -27
  199. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +38 -34
  200. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +75 -54
  201. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +32 -21
  202. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +97 -72
  203. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +44 -38
  204. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +145 -104
  205. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +106 -84
  206. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +60 -54
  207. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +93 -72
  208. package/src/resources/extensions/gsd/tests/doctor.test.ts +134 -104
  209. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +131 -123
  210. package/src/resources/extensions/gsd/tests/exit-command.test.ts +24 -20
  211. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +57 -48
  212. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +7 -5
  213. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +42 -30
  214. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +206 -198
  215. package/src/resources/extensions/gsd/tests/git-locale.test.ts +27 -13
  216. package/src/resources/extensions/gsd/tests/git-service.test.ts +388 -285
  217. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +39 -31
  218. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +69 -63
  219. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +264 -255
  220. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +119 -108
  221. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +103 -81
  222. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +262 -229
  223. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  224. package/src/resources/extensions/gsd/tests/health-widget.test.ts +37 -29
  225. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +102 -81
  226. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +18 -16
  227. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +46 -41
  228. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +53 -42
  229. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +91 -75
  230. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
  231. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +194 -150
  232. package/src/resources/extensions/gsd/tests/md-importer.test.ts +125 -101
  233. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +54 -45
  234. package/src/resources/extensions/gsd/tests/memory-store.test.ts +93 -80
  235. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +66 -57
  236. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +93 -83
  237. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +170 -161
  238. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +141 -125
  239. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +131 -107
  240. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +96 -87
  241. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +164 -125
  242. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +94 -81
  243. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +36 -35
  244. package/src/resources/extensions/gsd/tests/overrides.test.ts +106 -99
  245. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +47 -40
  246. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +28 -25
  247. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +83 -66
  248. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +77 -54
  249. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +115 -68
  250. package/src/resources/extensions/gsd/tests/parsers.test.ts +611 -546
  251. package/src/resources/extensions/gsd/tests/paths.test.ts +87 -72
  252. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +117 -77
  253. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  254. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +119 -93
  255. package/src/resources/extensions/gsd/tests/queue-order.test.ts +82 -70
  256. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +55 -42
  257. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +73 -45
  258. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +38 -28
  259. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +80 -73
  260. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +74 -71
  261. package/src/resources/extensions/gsd/tests/requirements.test.ts +75 -70
  262. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +66 -44
  263. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +181 -114
  264. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +65 -63
  265. package/src/resources/extensions/gsd/tests/run-uat.test.ts +128 -66
  266. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +25 -18
  267. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +44 -37
  268. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +26 -19
  269. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +8 -6
  270. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +28 -22
  271. package/src/resources/extensions/gsd/tests/token-savings.test.ts +56 -54
  272. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +25 -23
  273. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +11 -9
  274. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +82 -66
  275. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +47 -46
  276. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +22 -20
  277. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +86 -84
  278. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +43 -41
  279. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +96 -94
  280. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +13 -11
  281. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +29 -27
  282. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +52 -50
  283. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +13 -10
  284. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +18 -14
  285. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +39 -38
  286. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +21 -17
  287. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +30 -25
  288. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +37 -30
  289. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +22 -15
  290. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +66 -59
  291. package/src/resources/extensions/gsd/tests/worktree.test.ts +50 -44
  292. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +0 -1
  293. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
  294. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
  295. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +0 -100
  296. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +0 -63
  297. /package/dist/web/standalone/.next/static/{-zps1Q9mQmioAKLcQiCr8 → mgkxN0mGP6gSUmGPEzbk_}/_buildManifest.js +0 -0
  298. /package/dist/web/standalone/.next/static/{-zps1Q9mQmioAKLcQiCr8 → mgkxN0mGP6gSUmGPEzbk_}/_ssgManifest.js +0 -0
@@ -1,15 +1,15 @@
1
- import { describe, test, after } from 'node:test';
2
- import assert from 'node:assert/strict';
3
1
  import { parseRequirementCounts } from "../files.ts";
4
2
  import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
5
3
  import { join } from "node:path";
6
4
  import { tmpdir } from "node:os";
7
5
  import { deriveState } from "../state.ts";
8
6
  import { runGSDDoctor } from "../doctor.ts";
7
+ import { createTestContext } from './test-helpers.ts';
9
8
 
10
- describe('requirements', () => {
11
- test('requirement counts parser', () => {
12
- const counts = parseRequirementCounts(`# Requirements
9
+ const { assertEq, assertTrue, report } = createTestContext();
10
+ console.log("\n=== requirement counts parser ===");
11
+ {
12
+ const counts = parseRequirementCounts(`# Requirements
13
13
 
14
14
  ## Active
15
15
 
@@ -34,68 +34,73 @@ describe('requirements', () => {
34
34
  ### R030 — No
35
35
  - Status: out-of-scope
36
36
  `);
37
- assert.deepStrictEqual(counts.active, 2, "counts active requirements by section");
38
- assert.deepStrictEqual(counts.validated, 1, "counts validated requirements");
39
- assert.deepStrictEqual(counts.deferred, 1, "counts deferred requirements");
40
- assert.deepStrictEqual(counts.outOfScope, 1, "counts out of scope requirements");
41
- assert.deepStrictEqual(counts.blocked, 1, "counts blocked statuses");
42
- });
43
-
44
- const base = mkdtempSync(join(tmpdir(), "gsd-requirements-test-"));
45
- const gsd = join(base, ".gsd");
46
- const mDir = join(gsd, "milestones", "M001");
47
- const sDir = join(mDir, "slices", "S01");
48
- const tDir = join(sDir, "tasks");
49
- mkdirSync(tDir, { recursive: true });
50
- writeFileSync(join(gsd, "REQUIREMENTS.md"), [
51
- "# Requirements",
52
- "## Active",
53
- "### R001 — Missing owner",
54
- "- Class: core-capability",
55
- "- Status: active",
56
- "- Description: thing",
57
- "- Why it matters: thing",
58
- "- Source: user",
59
- "- Primary owning slice: none yet",
60
- "- Supporting slices: none",
61
- "- Validation: unmapped",
62
- "- Notes: none",
63
- "## Validated",
64
- "## Deferred",
65
- "## Out of Scope",
66
- "## Traceability",
67
- "",
68
- ].join("\n"), "utf-8");
69
- writeFileSync(join(mDir, "M001-ROADMAP.md"), [
70
- "# M001: Demo",
71
- "## Slices",
72
- "- [ ] **S01: Demo Slice** `risk:low` `depends:[]`",
73
- " > After this: demo works",
74
- "",
75
- ].join("\n"), "utf-8");
76
- writeFileSync(join(sDir, "S01-PLAN.md"), [
77
- "# S01: Demo Slice",
78
- "**Goal:** Demo",
79
- "**Demo:** Demo",
80
- "## Must-Haves",
81
- "- done",
82
- "## Tasks",
83
- "- [ ] **T01: Implement thing** `est:10m`",
84
- " Task is in progress.",
85
- "",
86
- ].join("\n"), "utf-8");
87
- test('deriveState includes requirements counts', async () => {
88
- const state = await deriveState(base);
89
- assert.ok(state.requirements !== undefined, "state includes requirements summary");
90
- assert.deepStrictEqual(state.requirements?.active, 1, "state reports active requirement count");
91
- });
92
-
93
- test('doctor flags orphaned active requirement', async () => {
94
- const report = await runGSDDoctor(base);
95
- assert.ok(report.issues.some(issue => issue.code === "active_requirement_missing_owner"), "doctor flags missing owner");
96
- });
97
-
98
- after(() => {
99
- rmSync(base, { recursive: true, force: true });
100
- });
101
- });
37
+ assertEq(counts.active, 2, "counts active requirements by section");
38
+ assertEq(counts.validated, 1, "counts validated requirements");
39
+ assertEq(counts.deferred, 1, "counts deferred requirements");
40
+ assertEq(counts.outOfScope, 1, "counts out of scope requirements");
41
+ assertEq(counts.blocked, 1, "counts blocked statuses");
42
+ }
43
+
44
+ const base = mkdtempSync(join(tmpdir(), "gsd-requirements-test-"));
45
+ const gsd = join(base, ".gsd");
46
+ const mDir = join(gsd, "milestones", "M001");
47
+ const sDir = join(mDir, "slices", "S01");
48
+ const tDir = join(sDir, "tasks");
49
+ mkdirSync(tDir, { recursive: true });
50
+ writeFileSync(join(gsd, "REQUIREMENTS.md"), `# Requirements
51
+
52
+ ## Active
53
+
54
+ ### R001 — Missing owner
55
+ - Class: core-capability
56
+ - Status: active
57
+ - Description: thing
58
+ - Why it matters: thing
59
+ - Source: user
60
+ - Primary owning slice: none yet
61
+ - Supporting slices: none
62
+ - Validation: unmapped
63
+ - Notes: none
64
+
65
+ ## Validated
66
+
67
+ ## Deferred
68
+
69
+ ## Out of Scope
70
+
71
+ ## Traceability
72
+ `, "utf-8");
73
+ writeFileSync(join(mDir, "M001-ROADMAP.md"), `# M001: Demo
74
+
75
+ ## Slices
76
+ - [ ] **S01: Demo Slice** \`risk:low\` \`depends:[]\`
77
+ > After this: demo works
78
+ `, "utf-8");
79
+ writeFileSync(join(sDir, "S01-PLAN.md"), `# S01: Demo Slice
80
+
81
+ **Goal:** Demo
82
+ **Demo:** Demo
83
+
84
+ ## Must-Haves
85
+ - done
86
+
87
+ ## Tasks
88
+ - [ ] **T01: Implement thing** \`est:10m\`
89
+ Task is in progress.
90
+ `, "utf-8");
91
+
92
+ console.log("\n=== deriveState includes requirements counts ===");
93
+ {
94
+ const state = await deriveState(base);
95
+ assertTrue(state.requirements !== undefined, "state includes requirements summary");
96
+ assertEq(state.requirements?.active, 1, "state reports active requirement count");
97
+ }
98
+
99
+ console.log("\n=== doctor flags orphaned active requirement ===");
100
+ {
101
+ const report = await runGSDDoctor(base);
102
+ assertTrue(report.issues.some(issue => issue.code === "active_requirement_missing_owner"), "doctor flags missing owner");
103
+ }
104
+
105
+ rmSync(base, { recursive: true, force: true });
106
+ report();
@@ -4,11 +4,10 @@
4
4
  // consuming code properly resets all completion state so deriveState
5
5
  // re-derives the task on the next loop iteration.
6
6
 
7
- import { describe, test } from 'node:test';
8
- import assert from 'node:assert/strict';
9
7
  import { mkdtempSync, mkdirSync, rmSync, writeFileSync, existsSync, readFileSync, unlinkSync } from "node:fs";
10
8
  import { join } from "node:path";
11
9
  import { tmpdir } from "node:os";
10
+ import { createTestContext } from "./test-helpers.ts";
12
11
  import {
13
12
  resetHookState,
14
13
  consumeRetryTrigger,
@@ -17,6 +16,8 @@ import {
17
16
  } from "../post-unit-hooks.ts";
18
17
  import { uncheckTaskInPlan } from "../undo.ts";
19
18
 
19
+ const { assertEq, assertTrue, report } = createTestContext();
20
+
20
21
  // ─── Fixture Helpers ───────────────────────────────────────────────────────
21
22
 
22
23
  function createRetryFixture(): { base: string; cleanup: () => void } {
@@ -64,65 +65,74 @@ function createRetryFixture(): { base: string; cleanup: () => void } {
64
65
  // Test: consumeRetryTrigger returns retryArtifact field
65
66
  // ═══════════════════════════════════════════════════════════════════════════
66
67
 
68
+ console.log("\n=== consumeRetryTrigger: returns null when no retry pending ===");
67
69
 
68
- describe('retry-state-reset', () => {
69
- test('consumeRetryTrigger: returns null when no retry pending', () => {
70
+ {
70
71
  resetHookState();
71
72
  const trigger = consumeRetryTrigger();
72
- assert.deepStrictEqual(trigger, null, "returns null when no retry pending");
73
- });
73
+ assertEq(trigger, null, "returns null when no retry pending");
74
+ }
74
75
 
75
76
  // ═══════════════════════════════════════════════════════════════════════════
76
77
  // Test: uncheckTaskInPlan reverses doctor's [x] mark
77
78
  // ═══════════════════════════════════════════════════════════════════════════
78
- test('Retry reset step 1: uncheck [x] → [ ] in PLAN.md', () => {
79
+
80
+ console.log("\n=== Retry reset step 1: uncheck [x] → [ ] in PLAN.md ===");
81
+
82
+ {
79
83
  const { base, cleanup } = createRetryFixture();
80
84
  try {
81
85
  const planFile = join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md");
82
86
 
83
87
  // Precondition: T01 is checked
84
88
  const before = readFileSync(planFile, "utf-8");
85
- assert.ok(before.includes("- [x] **T01:"), "precondition: T01 is checked [x]");
89
+ assertTrue(before.includes("- [x] **T01:"), "precondition: T01 is checked [x]");
86
90
 
87
91
  // Step 1: Uncheck T01
88
92
  const result = uncheckTaskInPlan(base, "M001", "S01", "T01");
89
- assert.ok(result, "uncheckTaskInPlan returns true");
93
+ assertTrue(result, "uncheckTaskInPlan returns true");
90
94
 
91
95
  // Verify T01 is now unchecked
92
96
  const after = readFileSync(planFile, "utf-8");
93
- assert.ok(after.includes("- [ ] **T01:"), "T01 is now unchecked [ ]");
94
- assert.ok(!after.includes("- [x] **T01:"), "T01 no longer has [x]");
97
+ assertTrue(after.includes("- [ ] **T01:"), "T01 is now unchecked [ ]");
98
+ assertTrue(!after.includes("- [x] **T01:"), "T01 no longer has [x]");
95
99
 
96
100
  // T02 is unaffected
97
- assert.ok(after.includes("- [ ] **T02:"), "T02 remains unchanged");
101
+ assertTrue(after.includes("- [ ] **T02:"), "T02 remains unchanged");
98
102
  } finally {
99
103
  cleanup();
100
104
  }
101
- });
105
+ }
102
106
 
103
107
  // ═══════════════════════════════════════════════════════════════════════════
104
108
  // Test: Delete SUMMARY.md for the task
105
109
  // ═══════════════════════════════════════════════════════════════════════════
106
- test('Retry reset step 2: delete SUMMARY.md', () => {
110
+
111
+ console.log("\n=== Retry reset step 2: delete SUMMARY.md ===");
112
+
113
+ {
107
114
  const { base, cleanup } = createRetryFixture();
108
115
  try {
109
116
  const summaryFile = join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks", "T01-SUMMARY.md");
110
117
 
111
118
  // Precondition: SUMMARY exists
112
- assert.ok(existsSync(summaryFile), "precondition: SUMMARY.md exists");
119
+ assertTrue(existsSync(summaryFile), "precondition: SUMMARY.md exists");
113
120
 
114
121
  // Step 2: Delete SUMMARY.md
115
122
  unlinkSync(summaryFile);
116
- assert.ok(!existsSync(summaryFile), "SUMMARY.md deleted");
123
+ assertTrue(!existsSync(summaryFile), "SUMMARY.md deleted");
117
124
  } finally {
118
125
  cleanup();
119
126
  }
120
- });
127
+ }
121
128
 
122
129
  // ═══════════════════════════════════════════════════════════════════════════
123
130
  // Test: Remove from completedUnits array and flush
124
131
  // ═══════════════════════════════════════════════════════════════════════════
125
- test('Retry reset step 3: remove from completedUnits', () => {
132
+
133
+ console.log("\n=== Retry reset step 3: remove from completedUnits ===");
134
+
135
+ {
126
136
  const { base, cleanup } = createRetryFixture();
127
137
  try {
128
138
  // Simulate the completedUnits array (as AutoSession would have it)
@@ -136,8 +146,8 @@ test('Retry reset step 3: remove from completedUnits', () => {
136
146
  u => !(u.type === "execute-task" && u.id === "M001/S01/T01"),
137
147
  );
138
148
 
139
- assert.deepStrictEqual(filtered.length, 1, "one unit removed from completedUnits");
140
- assert.deepStrictEqual(filtered[0].id, "M001/S01/T02", "T02 still in completedUnits");
149
+ assertEq(filtered.length, 1, "one unit removed from completedUnits");
150
+ assertEq(filtered[0].id, "M001/S01/T02", "T02 still in completedUnits");
141
151
 
142
152
  // Flush to completed-units.json
143
153
  const completedKeysPath = join(base, ".gsd", "completed-units.json");
@@ -145,36 +155,42 @@ test('Retry reset step 3: remove from completedUnits', () => {
145
155
  writeFileSync(completedKeysPath, JSON.stringify(keys, null, 2), "utf-8");
146
156
 
147
157
  const onDisk = JSON.parse(readFileSync(completedKeysPath, "utf-8"));
148
- assert.deepStrictEqual(onDisk.length, 1, "completed-units.json has one entry");
149
- assert.deepStrictEqual(onDisk[0], "execute-task/M001/S01/T02", "only T02 remains in completed-units.json");
158
+ assertEq(onDisk.length, 1, "completed-units.json has one entry");
159
+ assertEq(onDisk[0], "execute-task/M001/S01/T02", "only T02 remains in completed-units.json");
150
160
  } finally {
151
161
  cleanup();
152
162
  }
153
- });
163
+ }
154
164
 
155
165
  // ═══════════════════════════════════════════════════════════════════════════
156
166
  // Test: Delete the retry_on artifact
157
167
  // ═══════════════════════════════════════════════════════════════════════════
158
- test('Retry reset step 4: delete retry_on artifact', () => {
168
+
169
+ console.log("\n=== Retry reset step 4: delete retry_on artifact ===");
170
+
171
+ {
159
172
  const { base, cleanup } = createRetryFixture();
160
173
  try {
161
174
  const retryArtifactPath = resolveHookArtifactPath(base, "M001/S01/T01", "NEEDS-REWORK.md");
162
175
 
163
176
  // Precondition: artifact exists
164
- assert.ok(existsSync(retryArtifactPath), "precondition: retry artifact exists");
177
+ assertTrue(existsSync(retryArtifactPath), "precondition: retry artifact exists");
165
178
 
166
179
  // Step 4: Delete retry artifact
167
180
  unlinkSync(retryArtifactPath);
168
- assert.ok(!existsSync(retryArtifactPath), "retry artifact deleted");
181
+ assertTrue(!existsSync(retryArtifactPath), "retry artifact deleted");
169
182
  } finally {
170
183
  cleanup();
171
184
  }
172
- });
185
+ }
173
186
 
174
187
  // ═══════════════════════════════════════════════════════════════════════════
175
188
  // Test: Full retry reset sequence (all steps together)
176
189
  // ═══════════════════════════════════════════════════════════════════════════
177
- test('Full retry reset: all steps combined', () => {
190
+
191
+ console.log("\n=== Full retry reset: all steps combined ===");
192
+
193
+ {
178
194
  const { base, cleanup } = createRetryFixture();
179
195
  try {
180
196
  const trigger = {
@@ -226,27 +242,30 @@ test('Full retry reset: all steps combined', () => {
226
242
  // PLAN.md: T01 unchecked
227
243
  const planFile = join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md");
228
244
  const planContent = readFileSync(planFile, "utf-8");
229
- assert.ok(planContent.includes("- [ ] **T01:"), "after reset: T01 unchecked in PLAN");
230
- assert.ok(!planContent.includes("- [x] **T01:"), "after reset: T01 not checked in PLAN");
245
+ assertTrue(planContent.includes("- [ ] **T01:"), "after reset: T01 unchecked in PLAN");
246
+ assertTrue(!planContent.includes("- [x] **T01:"), "after reset: T01 not checked in PLAN");
231
247
 
232
248
  // SUMMARY.md: deleted
233
- assert.ok(!existsSync(summaryFile), "after reset: SUMMARY.md deleted");
249
+ assertTrue(!existsSync(summaryFile), "after reset: SUMMARY.md deleted");
234
250
 
235
251
  // completed-units.json: empty
236
252
  const onDisk = JSON.parse(readFileSync(completedKeysPath, "utf-8"));
237
- assert.deepStrictEqual(onDisk.length, 0, "after reset: completed-units.json is empty");
253
+ assertEq(onDisk.length, 0, "after reset: completed-units.json is empty");
238
254
 
239
255
  // Retry artifact: deleted
240
- assert.ok(!existsSync(retryArtifactPath), "after reset: retry artifact deleted");
256
+ assertTrue(!existsSync(retryArtifactPath), "after reset: retry artifact deleted");
241
257
  } finally {
242
258
  cleanup();
243
259
  }
244
- });
260
+ }
245
261
 
246
262
  // ═══════════════════════════════════════════════════════════════════════════
247
263
  // Test: Reset is idempotent — no crash when artifacts are already missing
248
264
  // ═══════════════════════════════════════════════════════════════════════════
249
- test('Retry reset: idempotent when artifacts already missing', () => {
265
+
266
+ console.log("\n=== Retry reset: idempotent when artifacts already missing ===");
267
+
268
+ {
250
269
  const base = mkdtempSync(join(tmpdir(), "gsd-retry-idempotent-"));
251
270
  try {
252
271
  // Create minimal structure — NO summary, NO retry artifact, NO plan
@@ -269,38 +288,41 @@ test('Retry reset: idempotent when artifacts already missing', () => {
269
288
 
270
289
  // Uncheck — returns false because no PLAN file
271
290
  const uncheckResult = uncheckTaskInPlan(base, mid, sid, tid);
272
- assert.ok(!uncheckResult, "uncheck returns false when no PLAN exists");
291
+ assertTrue(!uncheckResult, "uncheck returns false when no PLAN exists");
273
292
 
274
293
  // Summary does not exist — no crash
275
294
  const summaryFile = join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks", `${tid}-SUMMARY.md`);
276
- assert.ok(!existsSync(summaryFile), "no summary to delete — safe");
295
+ assertTrue(!existsSync(summaryFile), "no summary to delete — safe");
277
296
 
278
297
  // Retry artifact does not exist — no crash
279
298
  const retryPath = resolveHookArtifactPath(base, trigger.unitId, trigger.retryArtifact);
280
- assert.ok(!existsSync(retryPath), "no retry artifact to delete — safe");
299
+ assertTrue(!existsSync(retryPath), "no retry artifact to delete — safe");
281
300
 
282
301
  // completed-units.json filter on empty array — safe
283
302
  const completedUnits: Array<{ type: string; id: string }> = [];
284
303
  const filtered = completedUnits.filter(
285
304
  u => !(u.type === trigger.unitType && u.id === trigger.unitId),
286
305
  );
287
- assert.deepStrictEqual(filtered.length, 0, "filter on empty array is safe");
306
+ assertEq(filtered.length, 0, "filter on empty array is safe");
288
307
  } finally {
289
308
  rmSync(base, { recursive: true, force: true });
290
309
  }
291
- });
310
+ }
292
311
 
293
312
  // ═══════════════════════════════════════════════════════════════════════════
294
313
  // Test: resolveHookArtifactPath produces correct path for retry artifacts
295
314
  // ═══════════════════════════════════════════════════════════════════════════
296
- test('resolveHookArtifactPath: correct path for retry artifacts', () => {
315
+
316
+ console.log("\n=== resolveHookArtifactPath: correct path for retry artifacts ===");
317
+
318
+ {
297
319
  const base = "/project";
298
320
  const path = resolveHookArtifactPath(base, "M001/S01/T01", "NEEDS-REWORK.md");
299
- assert.deepStrictEqual(
321
+ assertEq(
300
322
  path,
301
323
  join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks", "T01-NEEDS-REWORK.md"),
302
324
  "retry artifact path resolves to task directory with task prefix",
303
325
  );
304
- });
326
+ }
305
327
 
306
- });
328
+ report();