crewly 1.20.183 → 1.20.185

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 (260) hide show
  1. package/config/constants.ts +83 -0
  2. package/config/index.ts +2 -0
  3. package/config/oss-boundary-allowlist.json +10 -0
  4. package/config/skills/agent/core/ask-owner/SKILL.md +5 -2
  5. package/config/skills/agent/core/complete-task/execute.sh +4 -12
  6. package/config/skills/agent/core/complete-task/execute.test.sh +11 -0
  7. package/config/skills/agent/core/report-status/SKILL.md +1 -1
  8. package/config/skills/agent/core/report-status/execute.sh +5 -10
  9. package/dist/backend/backend/src/constants.d.ts +84 -0
  10. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  11. package/dist/backend/backend/src/constants.js +79 -1
  12. package/dist/backend/backend/src/constants.js.map +1 -1
  13. package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts +11 -1
  14. package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts.map +1 -1
  15. package/dist/backend/backend/src/controllers/decisions/decisions.controller.js +38 -0
  16. package/dist/backend/backend/src/controllers/decisions/decisions.controller.js.map +1 -1
  17. package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -1
  18. package/dist/backend/backend/src/controllers/google/google.controller.js +3 -2
  19. package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -1
  20. package/dist/backend/backend/src/controllers/request/open-items.controller.d.ts +34 -0
  21. package/dist/backend/backend/src/controllers/request/open-items.controller.d.ts.map +1 -0
  22. package/dist/backend/backend/src/controllers/request/open-items.controller.js +96 -0
  23. package/dist/backend/backend/src/controllers/request/open-items.controller.js.map +1 -0
  24. package/dist/backend/backend/src/controllers/request/request.routes.d.ts +3 -0
  25. package/dist/backend/backend/src/controllers/request/request.routes.d.ts.map +1 -1
  26. package/dist/backend/backend/src/controllers/request/request.routes.js +9 -0
  27. package/dist/backend/backend/src/controllers/request/request.routes.js.map +1 -1
  28. package/dist/backend/backend/src/controllers/standing/standing.controller.d.ts +5 -2
  29. package/dist/backend/backend/src/controllers/standing/standing.controller.d.ts.map +1 -1
  30. package/dist/backend/backend/src/controllers/standing/standing.controller.js +3 -1
  31. package/dist/backend/backend/src/controllers/standing/standing.controller.js.map +1 -1
  32. package/dist/backend/backend/src/index.d.ts.map +1 -1
  33. package/dist/backend/backend/src/index.js +72 -2
  34. package/dist/backend/backend/src/index.js.map +1 -1
  35. package/dist/backend/backend/src/scripts/check-oss-boundary.d.ts +217 -0
  36. package/dist/backend/backend/src/scripts/check-oss-boundary.d.ts.map +1 -0
  37. package/dist/backend/backend/src/scripts/check-oss-boundary.js +490 -0
  38. package/dist/backend/backend/src/scripts/check-oss-boundary.js.map +1 -0
  39. package/dist/backend/backend/src/scripts/open-items-backfill.d.ts +16 -0
  40. package/dist/backend/backend/src/scripts/open-items-backfill.d.ts.map +1 -0
  41. package/dist/backend/backend/src/scripts/open-items-backfill.js +112 -0
  42. package/dist/backend/backend/src/scripts/open-items-backfill.js.map +1 -0
  43. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  44. package/dist/backend/backend/src/services/agent/agent-registration.service.js +4 -2
  45. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  46. package/dist/backend/backend/src/services/ai/prompt-modules/standing-answers.module.d.ts +3 -1
  47. package/dist/backend/backend/src/services/ai/prompt-modules/standing-answers.module.d.ts.map +1 -1
  48. package/dist/backend/backend/src/services/ai/prompt-modules/standing-answers.module.js +15 -4
  49. package/dist/backend/backend/src/services/ai/prompt-modules/standing-answers.module.js.map +1 -1
  50. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +9 -0
  51. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  52. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +11 -0
  53. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  54. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +10 -0
  55. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  56. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +20 -0
  57. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  58. package/dist/backend/backend/src/services/decisions/decision-card.d.ts +31 -4
  59. package/dist/backend/backend/src/services/decisions/decision-card.d.ts.map +1 -1
  60. package/dist/backend/backend/src/services/decisions/decision-card.js +60 -2
  61. package/dist/backend/backend/src/services/decisions/decision-card.js.map +1 -1
  62. package/dist/backend/backend/src/services/decisions/decision-skip-command.d.ts +56 -0
  63. package/dist/backend/backend/src/services/decisions/decision-skip-command.d.ts.map +1 -0
  64. package/dist/backend/backend/src/services/decisions/decision-skip-command.js +108 -0
  65. package/dist/backend/backend/src/services/decisions/decision-skip-command.js.map +1 -0
  66. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +113 -3
  67. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  68. package/dist/backend/backend/src/services/decisions/decision.service.js +199 -13
  69. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  70. package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts +8 -0
  71. package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -1
  72. package/dist/backend/backend/src/services/decisions/decision.wiring.js +25 -0
  73. package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -1
  74. package/dist/backend/backend/src/services/memory/agent-memory.service.d.ts +19 -0
  75. package/dist/backend/backend/src/services/memory/agent-memory.service.d.ts.map +1 -1
  76. package/dist/backend/backend/src/services/memory/agent-memory.service.js +48 -0
  77. package/dist/backend/backend/src/services/memory/agent-memory.service.js.map +1 -1
  78. package/dist/backend/backend/src/services/memory/memory.service.d.ts.map +1 -1
  79. package/dist/backend/backend/src/services/memory/memory.service.js +20 -0
  80. package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -1
  81. package/dist/backend/backend/src/services/memory/project-memory.service.d.ts +40 -0
  82. package/dist/backend/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
  83. package/dist/backend/backend/src/services/memory/project-memory.service.js +101 -0
  84. package/dist/backend/backend/src/services/memory/project-memory.service.js.map +1 -1
  85. package/dist/backend/backend/src/services/memory/role-knowledge-eligibility.d.ts +1 -1
  86. package/dist/backend/backend/src/services/memory/role-knowledge-eligibility.d.ts.map +1 -1
  87. package/dist/backend/backend/src/services/memory/role-knowledge-eligibility.js.map +1 -1
  88. package/dist/backend/backend/src/services/memory/standing-answers.service.d.ts +61 -1
  89. package/dist/backend/backend/src/services/memory/standing-answers.service.d.ts.map +1 -1
  90. package/dist/backend/backend/src/services/memory/standing-answers.service.js +71 -3
  91. package/dist/backend/backend/src/services/memory/standing-answers.service.js.map +1 -1
  92. package/dist/backend/backend/src/services/memory/standing-refresh.service.d.ts +7 -4
  93. package/dist/backend/backend/src/services/memory/standing-refresh.service.d.ts.map +1 -1
  94. package/dist/backend/backend/src/services/memory/standing-refresh.service.js +18 -9
  95. package/dist/backend/backend/src/services/memory/standing-refresh.service.js.map +1 -1
  96. package/dist/backend/backend/src/services/memory/task-log-filter.d.ts +27 -0
  97. package/dist/backend/backend/src/services/memory/task-log-filter.d.ts.map +1 -0
  98. package/dist/backend/backend/src/services/memory/task-log-filter.js +56 -0
  99. package/dist/backend/backend/src/services/memory/task-log-filter.js.map +1 -0
  100. package/dist/backend/backend/src/services/open-items/open-item-card.d.ts +66 -0
  101. package/dist/backend/backend/src/services/open-items/open-item-card.d.ts.map +1 -0
  102. package/dist/backend/backend/src/services/open-items/open-item-card.js +208 -0
  103. package/dist/backend/backend/src/services/open-items/open-item-card.js.map +1 -0
  104. package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts +114 -0
  105. package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -0
  106. package/dist/backend/backend/src/services/open-items/open-item-extractor.js +394 -0
  107. package/dist/backend/backend/src/services/open-items/open-item-extractor.js.map +1 -0
  108. package/dist/backend/backend/src/services/open-items/open-items-backfill.d.ts +95 -0
  109. package/dist/backend/backend/src/services/open-items/open-items-backfill.d.ts.map +1 -0
  110. package/dist/backend/backend/src/services/open-items/open-items-backfill.js +203 -0
  111. package/dist/backend/backend/src/services/open-items/open-items-backfill.js.map +1 -0
  112. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +367 -0
  113. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -0
  114. package/dist/backend/backend/src/services/open-items/open-items.service.js +880 -0
  115. package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -0
  116. package/dist/backend/backend/src/services/open-items/open-items.wiring.d.ts +44 -0
  117. package/dist/backend/backend/src/services/open-items/open-items.wiring.d.ts.map +1 -0
  118. package/dist/backend/backend/src/services/open-items/open-items.wiring.js +185 -0
  119. package/dist/backend/backend/src/services/open-items/open-items.wiring.js.map +1 -0
  120. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  121. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +4 -0
  122. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  123. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +13 -0
  124. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  125. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +34 -11
  126. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  127. package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
  128. package/dist/backend/backend/src/services/v3/request.service.js +15 -1
  129. package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
  130. package/dist/backend/backend/src/services/v3/ticket-review.service.d.ts.map +1 -1
  131. package/dist/backend/backend/src/services/v3/ticket-review.service.js +5 -1
  132. package/dist/backend/backend/src/services/v3/ticket-review.service.js.map +1 -1
  133. package/dist/backend/backend/src/services/wiki/wiki-process.service.d.ts.map +1 -1
  134. package/dist/backend/backend/src/services/wiki/wiki-process.service.js +4 -2
  135. package/dist/backend/backend/src/services/wiki/wiki-process.service.js.map +1 -1
  136. package/dist/backend/backend/src/services/wiki/wiki-queue.service.d.ts +103 -1
  137. package/dist/backend/backend/src/services/wiki/wiki-queue.service.d.ts.map +1 -1
  138. package/dist/backend/backend/src/services/wiki/wiki-queue.service.js +171 -20
  139. package/dist/backend/backend/src/services/wiki/wiki-queue.service.js.map +1 -1
  140. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts +60 -0
  141. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts.map +1 -1
  142. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js +121 -7
  143. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js.map +1 -1
  144. package/dist/backend/backend/src/types/decision.types.d.ts +33 -4
  145. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
  146. package/dist/backend/backend/src/types/v2/index.d.ts +2 -0
  147. package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
  148. package/dist/backend/backend/src/types/v2/index.js +1 -0
  149. package/dist/backend/backend/src/types/v2/index.js.map +1 -1
  150. package/dist/backend/backend/src/types/v2/open-item.types.d.ts +76 -0
  151. package/dist/backend/backend/src/types/v2/open-item.types.d.ts.map +1 -0
  152. package/dist/backend/backend/src/types/v2/open-item.types.js +14 -0
  153. package/dist/backend/backend/src/types/v2/open-item.types.js.map +1 -0
  154. package/dist/backend/backend/src/types/v2/request.types.d.ts +22 -1
  155. package/dist/backend/backend/src/types/v2/request.types.d.ts.map +1 -1
  156. package/dist/backend/backend/src/types/v2/request.types.js +10 -5
  157. package/dist/backend/backend/src/types/v2/request.types.js.map +1 -1
  158. package/dist/backend/build-info.json +2 -2
  159. package/dist/backend/config/constants.d.ts +73 -0
  160. package/dist/backend/config/constants.d.ts.map +1 -1
  161. package/dist/backend/config/constants.js +80 -0
  162. package/dist/backend/config/constants.js.map +1 -1
  163. package/dist/backend/config/index.d.ts +10 -2
  164. package/dist/backend/config/index.d.ts.map +1 -1
  165. package/dist/backend/config/index.js +2 -2
  166. package/dist/backend/config/index.js.map +1 -1
  167. package/dist/cli/backend/src/constants.d.ts +84 -0
  168. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  169. package/dist/cli/backend/src/constants.js +79 -1
  170. package/dist/cli/backend/src/constants.js.map +1 -1
  171. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  172. package/dist/cli/backend/src/services/agent/agent-registration.service.js +4 -2
  173. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  174. package/dist/cli/backend/src/services/ai/prompt-modules/standing-answers.module.d.ts +3 -1
  175. package/dist/cli/backend/src/services/ai/prompt-modules/standing-answers.module.d.ts.map +1 -1
  176. package/dist/cli/backend/src/services/ai/prompt-modules/standing-answers.module.js +15 -4
  177. package/dist/cli/backend/src/services/ai/prompt-modules/standing-answers.module.js.map +1 -1
  178. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +9 -0
  179. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  180. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +11 -0
  181. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  182. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +10 -0
  183. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  184. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +20 -0
  185. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  186. package/dist/cli/backend/src/services/decisions/decision-card.d.ts +31 -4
  187. package/dist/cli/backend/src/services/decisions/decision-card.d.ts.map +1 -1
  188. package/dist/cli/backend/src/services/decisions/decision-card.js +60 -2
  189. package/dist/cli/backend/src/services/decisions/decision-card.js.map +1 -1
  190. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +113 -3
  191. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  192. package/dist/cli/backend/src/services/decisions/decision.service.js +199 -13
  193. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  194. package/dist/cli/backend/src/services/memory/agent-memory.service.d.ts +19 -0
  195. package/dist/cli/backend/src/services/memory/agent-memory.service.d.ts.map +1 -1
  196. package/dist/cli/backend/src/services/memory/agent-memory.service.js +48 -0
  197. package/dist/cli/backend/src/services/memory/agent-memory.service.js.map +1 -1
  198. package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -1
  199. package/dist/cli/backend/src/services/memory/memory.service.js +20 -0
  200. package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -1
  201. package/dist/cli/backend/src/services/memory/project-memory.service.d.ts +40 -0
  202. package/dist/cli/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
  203. package/dist/cli/backend/src/services/memory/project-memory.service.js +101 -0
  204. package/dist/cli/backend/src/services/memory/project-memory.service.js.map +1 -1
  205. package/dist/cli/backend/src/services/memory/role-knowledge-eligibility.d.ts +1 -1
  206. package/dist/cli/backend/src/services/memory/role-knowledge-eligibility.d.ts.map +1 -1
  207. package/dist/cli/backend/src/services/memory/role-knowledge-eligibility.js.map +1 -1
  208. package/dist/cli/backend/src/services/memory/standing-answers.service.d.ts +61 -1
  209. package/dist/cli/backend/src/services/memory/standing-answers.service.d.ts.map +1 -1
  210. package/dist/cli/backend/src/services/memory/standing-answers.service.js +71 -3
  211. package/dist/cli/backend/src/services/memory/standing-answers.service.js.map +1 -1
  212. package/dist/cli/backend/src/services/memory/task-log-filter.d.ts +27 -0
  213. package/dist/cli/backend/src/services/memory/task-log-filter.d.ts.map +1 -0
  214. package/dist/cli/backend/src/services/memory/task-log-filter.js +56 -0
  215. package/dist/cli/backend/src/services/memory/task-log-filter.js.map +1 -0
  216. package/dist/cli/backend/src/services/open-items/open-item-card.d.ts +66 -0
  217. package/dist/cli/backend/src/services/open-items/open-item-card.d.ts.map +1 -0
  218. package/dist/cli/backend/src/services/open-items/open-item-card.js +208 -0
  219. package/dist/cli/backend/src/services/open-items/open-item-card.js.map +1 -0
  220. package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts +114 -0
  221. package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -0
  222. package/dist/cli/backend/src/services/open-items/open-item-extractor.js +394 -0
  223. package/dist/cli/backend/src/services/open-items/open-item-extractor.js.map +1 -0
  224. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +13 -0
  225. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  226. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +34 -11
  227. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  228. package/dist/cli/backend/src/services/v3/request.service.d.ts.map +1 -1
  229. package/dist/cli/backend/src/services/v3/request.service.js +15 -1
  230. package/dist/cli/backend/src/services/v3/request.service.js.map +1 -1
  231. package/dist/cli/backend/src/services/v3/ticket-review.service.d.ts.map +1 -1
  232. package/dist/cli/backend/src/services/v3/ticket-review.service.js +5 -1
  233. package/dist/cli/backend/src/services/v3/ticket-review.service.js.map +1 -1
  234. package/dist/cli/backend/src/types/decision.types.d.ts +33 -4
  235. package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
  236. package/dist/cli/backend/src/types/v2/index.d.ts +2 -0
  237. package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -1
  238. package/dist/cli/backend/src/types/v2/index.js +1 -0
  239. package/dist/cli/backend/src/types/v2/index.js.map +1 -1
  240. package/dist/cli/backend/src/types/v2/open-item.types.d.ts +76 -0
  241. package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -0
  242. package/dist/cli/backend/src/types/v2/open-item.types.js +14 -0
  243. package/dist/cli/backend/src/types/v2/open-item.types.js.map +1 -0
  244. package/dist/cli/backend/src/types/v2/request.types.d.ts +22 -1
  245. package/dist/cli/backend/src/types/v2/request.types.d.ts.map +1 -1
  246. package/dist/cli/backend/src/types/v2/request.types.js +10 -5
  247. package/dist/cli/backend/src/types/v2/request.types.js.map +1 -1
  248. package/dist/cli/config/constants.d.ts +73 -0
  249. package/dist/cli/config/constants.d.ts.map +1 -1
  250. package/dist/cli/config/constants.js +80 -0
  251. package/dist/cli/config/constants.js.map +1 -1
  252. package/dist/cli/config/index.d.ts +10 -2
  253. package/dist/cli/config/index.d.ts.map +1 -1
  254. package/dist/cli/config/index.js +2 -2
  255. package/dist/cli/config/index.js.map +1 -1
  256. package/frontend/dist/assets/{index-9c91de50.js → index-1ee8a9a2.js} +273 -273
  257. package/frontend/dist/assets/index-a79c7852.css +42 -0
  258. package/frontend/dist/index.html +2 -2
  259. package/package.json +2 -1
  260. package/frontend/dist/assets/index-04d192f8.css +0 -42
@@ -0,0 +1,490 @@
1
+ /**
2
+ * OSS/Pro boundary check (issue #809).
3
+ *
4
+ * CLAUDE.md Critical Rule 10 says premium/paid content never lives in the OSS
5
+ * repo. This module turns that prose into a check that fails when:
6
+ *
7
+ * 1. `paid-tier` — a JSON file under `config/templates/` declares
8
+ * `requiredTier` of `pro` or `enterprise` (at any depth);
9
+ * 2. `pro-template-field` — a JSON template under `config/templates/`
10
+ * defines a Pro-only top-level field (`workflows`,
11
+ * `verificationPipeline`, `qualityGates`);
12
+ * 3. `premium-path` — a file path under `config/` has a segment starting
13
+ * with `pro-` or containing `premium` (so `prompt`, `process-` and
14
+ * `improve-` are not matched);
15
+ * 4. `pro-import` — an OSS source file imports or requires `crewly-pro` or
16
+ * `@crewly/pro` (only real import/require specifiers count, never
17
+ * comments or prose).
18
+ *
19
+ * Exceptions live in `config/oss-boundary-allowlist.json`, one entry per
20
+ * path with the rule it is exempt from and a one-line reason.
21
+ *
22
+ * Run locally or in CI with `npm run check:oss-boundary`; the jest suite also
23
+ * runs it against the real tree (see `check-oss-boundary.test.ts`).
24
+ *
25
+ * @module backend/scripts/check-oss-boundary
26
+ */
27
+ import { existsSync, readFileSync, readdirSync } from 'fs';
28
+ import { extname, join, relative, sep } from 'path';
29
+ import { OSS_BOUNDARY_CONSTANTS, PROCESS_EXIT_CODES } from '../../../config/index.js';
30
+ const RULE_VALUES = Object.values(OSS_BOUNDARY_CONSTANTS.RULES);
31
+ /**
32
+ * Type guard for a rule identifier read from untrusted JSON.
33
+ *
34
+ * @param value - Candidate value
35
+ * @returns true when the value names one of the four rules
36
+ */
37
+ export function isOssBoundaryRule(value) {
38
+ return typeof value === 'string' && RULE_VALUES.includes(value);
39
+ }
40
+ /**
41
+ * Converts a path relative to the repo root into `/`-separated form so
42
+ * reports and allowlist entries look the same on every platform.
43
+ *
44
+ * @param repoRoot - Absolute repository root
45
+ * @param absolutePath - Absolute path inside the repository
46
+ * @returns The repository-relative POSIX path
47
+ */
48
+ function toRepoPath(repoRoot, absolutePath) {
49
+ return relative(repoRoot, absolutePath).split(sep).join('/');
50
+ }
51
+ /**
52
+ * Recursively lists every file below a directory, skipping `node_modules`,
53
+ * `dist` and `.git`. A missing directory yields no files.
54
+ *
55
+ * @param dir - Absolute directory to walk
56
+ * @returns Absolute file paths, sorted for stable output
57
+ */
58
+ export function listFiles(dir) {
59
+ if (!existsSync(dir)) {
60
+ return [];
61
+ }
62
+ const skipped = OSS_BOUNDARY_CONSTANTS.SKIPPED_DIRS;
63
+ const files = [];
64
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
65
+ const full = join(dir, entry.name);
66
+ if (entry.isDirectory()) {
67
+ if (!skipped.includes(entry.name)) {
68
+ files.push(...listFiles(full));
69
+ }
70
+ }
71
+ else if (entry.isFile()) {
72
+ files.push(full);
73
+ }
74
+ }
75
+ return files.sort();
76
+ }
77
+ /**
78
+ * Parses a JSON template file.
79
+ *
80
+ * @param file - Absolute path of the JSON file
81
+ * @param repoPath - Repository-relative path, used in the error message
82
+ * @returns The parsed value
83
+ * @throws Error when the file is not valid JSON — a broken template must not
84
+ * silently slip past the check
85
+ */
86
+ function readJson(file, repoPath) {
87
+ try {
88
+ return JSON.parse(readFileSync(file, 'utf8'));
89
+ }
90
+ catch (err) {
91
+ const message = err instanceof Error ? err.message : String(err);
92
+ throw new Error(`check-oss-boundary: ${repoPath} is not valid JSON (${message})`);
93
+ }
94
+ }
95
+ /**
96
+ * Narrows an unknown value to a plain JSON object.
97
+ *
98
+ * @param value - Candidate value
99
+ * @returns true when the value is a non-null, non-array object
100
+ */
101
+ function isJsonObject(value) {
102
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
103
+ }
104
+ /**
105
+ * Finds every paid `requiredTier` declaration anywhere inside a JSON value.
106
+ *
107
+ * @param value - Parsed JSON
108
+ * @param pointer - JSON pointer of `value` (empty for the document root)
109
+ * @returns Human-readable descriptions of each paid-tier declaration
110
+ */
111
+ export function findPaidTierDeclarations(value, pointer = '') {
112
+ const paidTiers = OSS_BOUNDARY_CONSTANTS.PAID_TIERS;
113
+ const found = [];
114
+ if (Array.isArray(value)) {
115
+ value.forEach((item, index) => found.push(...findPaidTierDeclarations(item, `${pointer}/${index}`)));
116
+ }
117
+ else if (isJsonObject(value)) {
118
+ for (const [key, child] of Object.entries(value)) {
119
+ const childPointer = `${pointer}/${key}`;
120
+ if (key === OSS_BOUNDARY_CONSTANTS.TIER_FIELD &&
121
+ typeof child === 'string' &&
122
+ paidTiers.includes(child.toLowerCase())) {
123
+ found.push(`${childPointer} is "${child}"`);
124
+ }
125
+ found.push(...findPaidTierDeclarations(child, childPointer));
126
+ }
127
+ }
128
+ return found;
129
+ }
130
+ /**
131
+ * Lists the Pro-only fields a template defines at its top level.
132
+ *
133
+ * @param value - Parsed template JSON
134
+ * @returns Names of the Pro-only fields present
135
+ */
136
+ export function findProOnlyTemplateFields(value) {
137
+ if (!isJsonObject(value)) {
138
+ return [];
139
+ }
140
+ return OSS_BOUNDARY_CONSTANTS.PRO_ONLY_TEMPLATE_FIELDS.filter((field) => field in value);
141
+ }
142
+ /**
143
+ * Returns the path segments that look like Pro or premium content: a segment
144
+ * that starts with `pro-` or contains `premium` (case-insensitive). Whole
145
+ * segments are tested so names like `prompt`, `process-` or `improve-` never
146
+ * match.
147
+ *
148
+ * @param repoPath - `/`-separated path
149
+ * @returns The offending segments, empty when the path is clean
150
+ */
151
+ export function findPremiumSegments(repoPath) {
152
+ return repoPath.split('/').filter((segment) => {
153
+ const lower = segment.toLowerCase();
154
+ return (lower.startsWith(OSS_BOUNDARY_CONSTANTS.PRO_SEGMENT_PREFIX) ||
155
+ lower.includes(OSS_BOUNDARY_CONSTANTS.PREMIUM_SEGMENT_MARKER));
156
+ });
157
+ }
158
+ /**
159
+ * Blanks out comments in JS/TS source while keeping string literals, so
160
+ * import specifiers can be matched without tripping on commented-out code
161
+ * or prose. Quoted strings end at a newline, which bounds the damage a
162
+ * regex literal containing a quote can do.
163
+ *
164
+ * @param source - Source text
165
+ * @returns The source with every comment replaced by spaces
166
+ */
167
+ export function stripComments(source) {
168
+ let out = '';
169
+ let i = 0;
170
+ while (i < source.length) {
171
+ const ch = source[i];
172
+ const next = source[i + 1];
173
+ if (ch === '/' && next === '/') {
174
+ while (i < source.length && source[i] !== '\n') {
175
+ out += ' ';
176
+ i++;
177
+ }
178
+ }
179
+ else if (ch === '/' && next === '*') {
180
+ const end = source.indexOf('*/', i + 2);
181
+ const stop = end === -1 ? source.length : end + 2;
182
+ out += source.slice(i, stop).replace(/[^\n]/g, ' ');
183
+ i = stop;
184
+ }
185
+ else if (ch === '"' || ch === "'" || ch === '`') {
186
+ let j = i + 1;
187
+ while (j < source.length && source[j] !== ch && (ch === '`' || source[j] !== '\n')) {
188
+ j += source[j] === '\\' ? 2 : 1;
189
+ }
190
+ const stop = Math.min(j + 1, source.length);
191
+ out += source.slice(i, stop);
192
+ i = stop;
193
+ }
194
+ else {
195
+ out += ch;
196
+ i++;
197
+ }
198
+ }
199
+ return out;
200
+ }
201
+ /** Patterns whose first capture group is a module specifier */
202
+ const SPECIFIER_PATTERNS = [
203
+ // import x from '…' / export { x } from '…' / import type { T } from '…'
204
+ /\bfrom\s*(['"])([^'"\n]+)\1/g,
205
+ // import '…' (side-effect import)
206
+ /\bimport\s*(['"])([^'"\n]+)\1/g,
207
+ // import('…') (dynamic import) and require('…')
208
+ /\b(?:import|require)\s*\(\s*(['"`])([^'"`\n]+)\1\s*\)/g,
209
+ ];
210
+ /**
211
+ * Extracts the module specifiers a source file imports or requires.
212
+ *
213
+ * @param source - JS/TS source text
214
+ * @returns Every specifier found, in order of appearance per pattern
215
+ *
216
+ * @example
217
+ * ```typescript
218
+ * extractImportSpecifiers("import a from 'x'; const b = require('y');"); // ['x', 'y']
219
+ * ```
220
+ */
221
+ export function extractImportSpecifiers(source) {
222
+ const code = stripComments(source);
223
+ const specifiers = [];
224
+ for (const pattern of SPECIFIER_PATTERNS) {
225
+ for (const match of code.matchAll(pattern)) {
226
+ specifiers.push(match[2]);
227
+ }
228
+ }
229
+ return specifiers;
230
+ }
231
+ /**
232
+ * Tells whether a specifier names a forbidden Pro package or one of its
233
+ * subpaths (e.g. `crewly-pro/dist/x`). Look-alikes such as `crewly-protocol`
234
+ * do not match.
235
+ *
236
+ * @param specifier - Module specifier
237
+ * @returns The forbidden package name, or null
238
+ */
239
+ export function forbiddenPackageFor(specifier) {
240
+ for (const pkg of OSS_BOUNDARY_CONSTANTS.FORBIDDEN_IMPORT_PACKAGES) {
241
+ if (specifier === pkg || specifier.startsWith(`${pkg}/`)) {
242
+ return pkg;
243
+ }
244
+ }
245
+ return null;
246
+ }
247
+ /**
248
+ * Rules 1 and 2: scans JSON under `config/templates/`.
249
+ *
250
+ * @param repoRoot - Absolute repository root
251
+ * @returns Paid-tier and Pro-only-field violations
252
+ * @throws Error when a template file is not valid JSON
253
+ */
254
+ export function checkTemplates(repoRoot) {
255
+ const violations = [];
256
+ const files = listFiles(join(repoRoot, OSS_BOUNDARY_CONSTANTS.TEMPLATES_DIR)).filter((file) => extname(file) === OSS_BOUNDARY_CONSTANTS.JSON_EXTENSION);
257
+ for (const file of files) {
258
+ const repoPath = toRepoPath(repoRoot, file);
259
+ const json = readJson(file, repoPath);
260
+ for (const declaration of findPaidTierDeclarations(json)) {
261
+ violations.push({
262
+ rule: OSS_BOUNDARY_CONSTANTS.RULES.PAID_TIER,
263
+ path: repoPath,
264
+ detail: `paid tier declared: ${declaration}`,
265
+ });
266
+ }
267
+ for (const field of findProOnlyTemplateFields(json)) {
268
+ violations.push({
269
+ rule: OSS_BOUNDARY_CONSTANTS.RULES.PRO_TEMPLATE_FIELD,
270
+ path: repoPath,
271
+ detail: `Pro-only template field "${field}"`,
272
+ });
273
+ }
274
+ }
275
+ return violations;
276
+ }
277
+ /**
278
+ * Rule 3: scans every file path under `config/` for Pro/premium segments.
279
+ *
280
+ * @param repoRoot - Absolute repository root
281
+ * @returns Premium-path violations
282
+ */
283
+ export function checkConfigPaths(repoRoot) {
284
+ const violations = [];
285
+ for (const file of listFiles(join(repoRoot, OSS_BOUNDARY_CONSTANTS.CONFIG_DIR))) {
286
+ const repoPath = toRepoPath(repoRoot, file);
287
+ const segments = findPremiumSegments(repoPath);
288
+ if (segments.length > 0) {
289
+ violations.push({
290
+ rule: OSS_BOUNDARY_CONSTANTS.RULES.PREMIUM_PATH,
291
+ path: repoPath,
292
+ detail: `premium-looking path segment(s): ${segments.join(', ')}`,
293
+ });
294
+ }
295
+ }
296
+ return violations;
297
+ }
298
+ /**
299
+ * Lists the source roots rule 4 scans: the fixed roots plus each workspace
300
+ * package's `src` directory.
301
+ *
302
+ * @param repoRoot - Absolute repository root
303
+ * @returns Absolute directories (some may not exist; those scan as empty)
304
+ */
305
+ export function sourceRoots(repoRoot) {
306
+ const roots = OSS_BOUNDARY_CONSTANTS.SOURCE_ROOTS.map((root) => join(repoRoot, root));
307
+ const packagesDir = join(repoRoot, OSS_BOUNDARY_CONSTANTS.PACKAGES_DIR);
308
+ if (existsSync(packagesDir)) {
309
+ for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {
310
+ if (entry.isDirectory()) {
311
+ roots.push(join(packagesDir, entry.name, OSS_BOUNDARY_CONSTANTS.PACKAGE_SOURCE_SUBDIR));
312
+ }
313
+ }
314
+ }
315
+ return roots;
316
+ }
317
+ /**
318
+ * Rule 4: scans OSS source for imports of the Pro package.
319
+ *
320
+ * @param repoRoot - Absolute repository root
321
+ * @returns Pro-import violations
322
+ */
323
+ export function checkSourceImports(repoRoot) {
324
+ const extensions = OSS_BOUNDARY_CONSTANTS.SOURCE_EXTENSIONS;
325
+ const violations = [];
326
+ for (const root of sourceRoots(repoRoot)) {
327
+ for (const file of listFiles(root).filter((f) => extensions.includes(extname(f)))) {
328
+ for (const specifier of extractImportSpecifiers(readFileSync(file, 'utf8'))) {
329
+ const pkg = forbiddenPackageFor(specifier);
330
+ if (pkg !== null) {
331
+ violations.push({
332
+ rule: OSS_BOUNDARY_CONSTANTS.RULES.PRO_IMPORT,
333
+ path: toRepoPath(repoRoot, file),
334
+ detail: `imports "${specifier}" (${pkg} is the paid extension; OSS must not depend on it)`,
335
+ });
336
+ }
337
+ }
338
+ }
339
+ }
340
+ return violations;
341
+ }
342
+ /**
343
+ * Validates the parsed allowlist document.
344
+ *
345
+ * @param value - Parsed allowlist JSON
346
+ * @param source - Where it came from, for error messages
347
+ * @returns The validated entries
348
+ * @throws Error when the document is not `{ "entries": [...] }` or an entry
349
+ * lacks a known rule, a path or a non-empty one-line reason
350
+ */
351
+ export function parseAllowlist(value, source) {
352
+ if (!isJsonObject(value) || !Array.isArray(value.entries)) {
353
+ throw new Error(`check-oss-boundary: ${source} must be an object with an "entries" array`);
354
+ }
355
+ return value.entries.map((entry, index) => {
356
+ const where = `${source} entries[${index}]`;
357
+ if (!isJsonObject(entry)) {
358
+ throw new Error(`check-oss-boundary: ${where} must be an object`);
359
+ }
360
+ const { rule, path, reason } = entry;
361
+ if (!isOssBoundaryRule(rule)) {
362
+ throw new Error(`check-oss-boundary: ${where} has unknown rule ${JSON.stringify(rule)}; expected one of ${RULE_VALUES.join(', ')}`);
363
+ }
364
+ if (typeof path !== 'string' || path.trim() === '') {
365
+ throw new Error(`check-oss-boundary: ${where} needs a non-empty "path"`);
366
+ }
367
+ if (typeof reason !== 'string' || reason.trim() === '' || reason.includes('\n')) {
368
+ throw new Error(`check-oss-boundary: ${where} needs a one-line, non-empty "reason"`);
369
+ }
370
+ return { rule, path, reason };
371
+ });
372
+ }
373
+ /**
374
+ * Loads the allowlist from the repository. A missing file means no
375
+ * exceptions.
376
+ *
377
+ * @param repoRoot - Absolute repository root
378
+ * @returns The validated entries
379
+ * @throws Error when the file exists but is malformed
380
+ */
381
+ export function loadAllowlist(repoRoot) {
382
+ const file = join(repoRoot, OSS_BOUNDARY_CONSTANTS.ALLOWLIST_FILE);
383
+ if (!existsSync(file)) {
384
+ return [];
385
+ }
386
+ return parseAllowlist(readJson(file, OSS_BOUNDARY_CONSTANTS.ALLOWLIST_FILE), OSS_BOUNDARY_CONSTANTS.ALLOWLIST_FILE);
387
+ }
388
+ /**
389
+ * Tells whether an allowlist entry excuses a violation: same rule, and the
390
+ * path matches exactly or sits below an entry path ending in `/`.
391
+ *
392
+ * @param entry - Allowlist entry
393
+ * @param violation - Violation to test
394
+ * @returns true when the entry covers the violation
395
+ */
396
+ export function allowlistCovers(entry, violation) {
397
+ if (entry.rule !== violation.rule) {
398
+ return false;
399
+ }
400
+ return entry.path.endsWith('/') ? violation.path.startsWith(entry.path) : entry.path === violation.path;
401
+ }
402
+ /**
403
+ * Runs all four rules against a repository and applies the allowlist.
404
+ *
405
+ * @param repoRoot - Absolute repository root
406
+ * @param allowlist - Exceptions; defaults to the repository's allowlist file
407
+ * @returns Unexcused violations, excused ones and stale allowlist entries
408
+ * @throws Error when a template or the allowlist is malformed JSON
409
+ *
410
+ * @example
411
+ * ```typescript
412
+ * const report = checkOssBoundary(process.cwd());
413
+ * if (report.violations.length > 0) process.exit(1);
414
+ * ```
415
+ */
416
+ export function checkOssBoundary(repoRoot, allowlist = loadAllowlist(repoRoot)) {
417
+ const all = [...checkTemplates(repoRoot), ...checkConfigPaths(repoRoot), ...checkSourceImports(repoRoot)];
418
+ const used = new Set();
419
+ const violations = [];
420
+ const allowed = [];
421
+ for (const violation of all) {
422
+ const entry = allowlist.find((candidate) => allowlistCovers(candidate, violation));
423
+ if (entry) {
424
+ used.add(entry);
425
+ allowed.push(violation);
426
+ }
427
+ else {
428
+ violations.push(violation);
429
+ }
430
+ }
431
+ return {
432
+ violations,
433
+ allowed,
434
+ unusedAllowlistEntries: allowlist.filter((entry) => !used.has(entry)),
435
+ };
436
+ }
437
+ /**
438
+ * Renders a report for the terminal / CI log.
439
+ *
440
+ * @param report - Result of {@link checkOssBoundary}
441
+ * @returns Multi-line text; starts with "OK" or "FAIL"
442
+ */
443
+ export function formatReport(report) {
444
+ const lines = [];
445
+ if (report.violations.length === 0) {
446
+ lines.push(`OK: OSS/Pro boundary holds (${report.allowed.length} allowlisted exception(s)).`);
447
+ }
448
+ else {
449
+ lines.push(`FAIL: ${report.violations.length} OSS/Pro boundary violation(s) — premium content belongs in crewly-pro (CLAUDE.md rule 10, #809):`);
450
+ for (const v of report.violations) {
451
+ lines.push(` [${v.rule}] ${v.path}: ${v.detail}`);
452
+ }
453
+ lines.push(`Move the content to crewly-pro, or add an entry with a one-line reason to ${OSS_BOUNDARY_CONSTANTS.ALLOWLIST_FILE}.`);
454
+ }
455
+ for (const entry of report.unusedAllowlistEntries) {
456
+ lines.push(` note: allowlist entry [${entry.rule}] ${entry.path} matched nothing — remove it once the owner confirms.`);
457
+ }
458
+ return lines.join('\n');
459
+ }
460
+ /**
461
+ * CLI entry: checks the repository and reports.
462
+ *
463
+ * @param repoRoot - Absolute repository root
464
+ * @param log - Sink for the passing report
465
+ * @param error - Sink for the failing report or a malformed-input error
466
+ * @returns Process exit code: success when no unexcused violations
467
+ */
468
+ export function runCli(repoRoot, log = (m) => console.log(m), error = (m) => console.error(m)) {
469
+ try {
470
+ const report = checkOssBoundary(repoRoot);
471
+ const text = formatReport(report);
472
+ if (report.violations.length > 0) {
473
+ error(text);
474
+ return PROCESS_EXIT_CODES.ERROR;
475
+ }
476
+ log(text);
477
+ return PROCESS_EXIT_CODES.SUCCESS;
478
+ }
479
+ catch (err) {
480
+ error(err instanceof Error ? err.message : String(err));
481
+ return PROCESS_EXIT_CODES.ERROR;
482
+ }
483
+ }
484
+ /* c8 ignore start — CLI entry, exercised by `npm run check:oss-boundary` */
485
+ const invokedDirectly = process.argv[1] !== undefined && /check-oss-boundary\.(ts|js)$/.test(process.argv[1]);
486
+ if (invokedDirectly) {
487
+ process.exitCode = runCli(process.cwd());
488
+ }
489
+ /* c8 ignore stop */
490
+ //# sourceMappingURL=check-oss-boundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-oss-boundary.js","sourceRoot":"","sources":["../../../../../backend/src/scripts/check-oss-boundary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Open-items backfill — DRY RUN against a running Crewly
3
+ * (specs/2026-10-01-reply-open-items.md §6).
4
+ *
5
+ * Reads tickets and WorkItems over the local API, and the chat database
6
+ * read-only, then prints the open items the backfill would create. It never
7
+ * changes anything; to apply, call `POST /api/requests/open-items/backfill`
8
+ * with `{"apply": true}` on an instance that runs this version.
9
+ *
10
+ * Usage:
11
+ * node dist/backend/backend/src/scripts/open-items-backfill.js [--url http://localhost:8787] [--home ~/.crewly] [--json]
12
+ *
13
+ * @module scripts/open-items-backfill
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=open-items-backfill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-items-backfill.d.ts","sourceRoot":"","sources":["../../../../../backend/src/scripts/open-items-backfill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Open-items backfill — DRY RUN against a running Crewly
3
+ * (specs/2026-10-01-reply-open-items.md §6).
4
+ *
5
+ * Reads tickets and WorkItems over the local API, and the chat database
6
+ * read-only, then prints the open items the backfill would create. It never
7
+ * changes anything; to apply, call `POST /api/requests/open-items/backfill`
8
+ * with `{"apply": true}` on an instance that runs this version.
9
+ *
10
+ * Usage:
11
+ * node dist/backend/backend/src/scripts/open-items-backfill.js [--url http://localhost:8787] [--home ~/.crewly] [--json]
12
+ *
13
+ * @module scripts/open-items-backfill
14
+ */
15
+ import * as fs from 'fs';
16
+ import * as os from 'os';
17
+ import * as path from 'path';
18
+ import Database from 'better-sqlite3';
19
+ import { OpenItemsService } from '../services/open-items/open-items.service.js';
20
+ import { backfillOpenItems, formatBackfillReport } from '../services/open-items/open-items-backfill.js';
21
+ /**
22
+ * Read a flag value.
23
+ *
24
+ * @param name - Flag
25
+ * @returns Value, or undefined
26
+ */
27
+ function arg(name) {
28
+ const i = process.argv.indexOf(name);
29
+ return i >= 0 ? process.argv[i + 1] : undefined;
30
+ }
31
+ /**
32
+ * GET a Crewly API path.
33
+ *
34
+ * @param base - Base URL
35
+ * @param token - API token
36
+ * @param p - Path
37
+ * @returns `data` of the response
38
+ */
39
+ async function get(base, token, p) {
40
+ const res = await fetch(`${base}${p}`, { headers: { 'x-crewly-token': token } });
41
+ if (!res.ok)
42
+ throw new Error(`GET ${p}: HTTP ${res.status}`);
43
+ const body = (await res.json());
44
+ return body.data;
45
+ }
46
+ /** Run the dry-run and print the report. */
47
+ async function main() {
48
+ if (process.argv.includes('--apply')) {
49
+ console.error('This script only does a dry run. Apply with POST /api/requests/open-items/backfill {"apply": true}.');
50
+ process.exit(2);
51
+ }
52
+ const home = (arg('--home') ?? path.join(os.homedir(), '.crewly')).replace(/^~/, os.homedir());
53
+ const base = arg('--url') ?? 'http://localhost:8787';
54
+ const token = fs.readFileSync(path.join(home, 'api-token'), 'utf8').trim();
55
+ const db = new Database(path.join(home, 'chat.db'), { readonly: true, fileMustExist: true });
56
+ const requests = await get(base, token, '/api/requests');
57
+ const workItems = await get(base, token, '/api/task-pool/items');
58
+ const teams = await get(base, token, '/api/teams').catch(() => []);
59
+ let decisions = [];
60
+ try {
61
+ const raw = JSON.parse(fs.readFileSync(path.join(home, 'owner-decisions.json'), 'utf8'));
62
+ decisions = raw.decisions ?? [];
63
+ }
64
+ catch {
65
+ decisions = [];
66
+ }
67
+ const names = new Map();
68
+ for (const t of teams)
69
+ for (const m of t.members ?? [])
70
+ if (m.sessionName && m.name)
71
+ names.set(m.sessionName, m.name);
72
+ // Read-only service: no follow-ups, cards, wakes or notes.
73
+ const service = new OpenItemsService({
74
+ requests: {
75
+ getById: async (id) => requests.find((r) => r.id === id) ?? null,
76
+ listAll: async () => requests,
77
+ update: async () => {
78
+ throw new Error('dry run: no writes');
79
+ },
80
+ },
81
+ listWorkItems: async () => workItems,
82
+ recentDecisionsBy: async (agent, sinceMs) => decisions.filter((d) => d.asker === agent && Date.parse(d.createdAt) >= sinceMs),
83
+ deliverToAgent: async () => false,
84
+ postOwnerNote: async () => false,
85
+ displayName: async (s) => names.get(s) ?? s,
86
+ colleagueNames: async (s) => [...names.entries()].filter(([k]) => k !== s).map(([, v]) => v),
87
+ });
88
+ const stmt = db.prepare(`SELECT id, channel_id, sender_type, sender_id, content, created_at, metadata, thread_id
89
+ FROM chat_messages WHERE channel_id = ? AND (id = ? OR thread_id = ?) ORDER BY seq ASC`);
90
+ const report = await backfillOpenItems({
91
+ service,
92
+ listRequests: async () => requests,
93
+ listWorkItems: async () => workItems,
94
+ listThread: async (channelId, rootId) => stmt.all(channelId, rootId, rootId).map((r) => ({
95
+ id: String(r.id),
96
+ channelId: String(r.channel_id),
97
+ senderType: String(r.sender_type),
98
+ senderId: String(r.sender_id),
99
+ content: String(r.content ?? ''),
100
+ createdAt: Number(r.created_at),
101
+ ...(r.thread_id ? { threadId: String(r.thread_id) } : {}),
102
+ ...(r.metadata ? { metadata: JSON.parse(String(r.metadata)) } : {}),
103
+ })),
104
+ });
105
+ db.close();
106
+ console.log(process.argv.includes('--json') ? JSON.stringify(report, null, 2) : formatBackfillReport(report));
107
+ }
108
+ main().catch((err) => {
109
+ console.error(err instanceof Error ? err.message : String(err));
110
+ process.exit(1);
111
+ });
112
+ //# sourceMappingURL=open-items-backfill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-items-backfill.js","sourceRoot":"","sources":["../../../../../backend/src/scripts/open-items-backfill.ts"],"names":[],"mappings":"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"}