light-plan 0.0.0-stage → 0.1.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 (963) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3181 -2
  3. package/assets/README.md +111 -0
  4. package/assets/agents/lpm-developer.md +468 -0
  5. package/assets/agents/lpm-planner.md +532 -0
  6. package/assets/harnesses/claude.yml +43 -0
  7. package/assets/harnesses/copilot.yml +54 -0
  8. package/assets/harnesses/reasonix.yml +49 -0
  9. package/assets/hcm/light-plan.yml +45 -0
  10. package/assets/skills/lpm-board-health.md +243 -0
  11. package/assets/skills/lpm-board-setup.md +354 -0
  12. package/assets/skills/lpm-delivery.md +344 -0
  13. package/assets/skills/lpm-planning.md +411 -0
  14. package/assets/skills/lpm-templates.md +144 -0
  15. package/assets/skills/lpm.md +267 -0
  16. package/dist/cli/agent-view.d.ts +27 -0
  17. package/dist/cli/agent-view.js +247 -0
  18. package/dist/cli/agent-view.js.map +1 -0
  19. package/dist/cli/commands/agent/assets.d.ts +64 -0
  20. package/dist/cli/commands/agent/assets.js +106 -0
  21. package/dist/cli/commands/agent/assets.js.map +1 -0
  22. package/dist/cli/commands/agent/glob.d.ts +25 -0
  23. package/dist/cli/commands/agent/glob.js +82 -0
  24. package/dist/cli/commands/agent/glob.js.map +1 -0
  25. package/dist/cli/commands/agent/index.d.ts +11 -0
  26. package/dist/cli/commands/agent/index.js +284 -0
  27. package/dist/cli/commands/agent/index.js.map +1 -0
  28. package/dist/cli/commands/agent/install.d.ts +59 -0
  29. package/dist/cli/commands/agent/install.js +131 -0
  30. package/dist/cli/commands/agent/install.js.map +1 -0
  31. package/dist/cli/commands/agent/mapping.d.ts +175 -0
  32. package/dist/cli/commands/agent/mapping.js +256 -0
  33. package/dist/cli/commands/agent/mapping.js.map +1 -0
  34. package/dist/cli/commands/check.d.ts +2 -0
  35. package/dist/cli/commands/check.js +81 -0
  36. package/dist/cli/commands/check.js.map +1 -0
  37. package/dist/cli/commands/comment.d.ts +2 -0
  38. package/dist/cli/commands/comment.js +104 -0
  39. package/dist/cli/commands/comment.js.map +1 -0
  40. package/dist/cli/commands/convert.d.ts +2 -0
  41. package/dist/cli/commands/convert.js +115 -0
  42. package/dist/cli/commands/convert.js.map +1 -0
  43. package/dist/cli/commands/copy.d.ts +2 -0
  44. package/dist/cli/commands/copy.js +69 -0
  45. package/dist/cli/commands/copy.js.map +1 -0
  46. package/dist/cli/commands/export.d.ts +11 -0
  47. package/dist/cli/commands/export.js +226 -0
  48. package/dist/cli/commands/export.js.map +1 -0
  49. package/dist/cli/commands/flag.d.ts +2 -0
  50. package/dist/cli/commands/flag.js +172 -0
  51. package/dist/cli/commands/flag.js.map +1 -0
  52. package/dist/cli/commands/git.d.ts +11 -0
  53. package/dist/cli/commands/git.js +357 -0
  54. package/dist/cli/commands/git.js.map +1 -0
  55. package/dist/cli/commands/hcm/bundle.d.ts +60 -0
  56. package/dist/cli/commands/hcm/bundle.js +166 -0
  57. package/dist/cli/commands/hcm/bundle.js.map +1 -0
  58. package/dist/cli/commands/hcm/index.d.ts +11 -0
  59. package/dist/cli/commands/hcm/index.js +162 -0
  60. package/dist/cli/commands/hcm/index.js.map +1 -0
  61. package/dist/cli/commands/init.d.ts +2 -0
  62. package/dist/cli/commands/init.js +81 -0
  63. package/dist/cli/commands/init.js.map +1 -0
  64. package/dist/cli/commands/insert.d.ts +2 -0
  65. package/dist/cli/commands/insert.js +70 -0
  66. package/dist/cli/commands/insert.js.map +1 -0
  67. package/dist/cli/commands/instructions.d.ts +7 -0
  68. package/dist/cli/commands/instructions.js +256 -0
  69. package/dist/cli/commands/instructions.js.map +1 -0
  70. package/dist/cli/commands/link.d.ts +2 -0
  71. package/dist/cli/commands/link.js +121 -0
  72. package/dist/cli/commands/link.js.map +1 -0
  73. package/dist/cli/commands/mcp/config.d.ts +71 -0
  74. package/dist/cli/commands/mcp/config.js +119 -0
  75. package/dist/cli/commands/mcp/config.js.map +1 -0
  76. package/dist/cli/commands/mcp/index.d.ts +9 -0
  77. package/dist/cli/commands/mcp/index.js +92 -0
  78. package/dist/cli/commands/mcp/index.js.map +1 -0
  79. package/dist/cli/commands/mcp/serve.d.ts +1 -0
  80. package/dist/cli/commands/mcp/serve.js +76 -0
  81. package/dist/cli/commands/mcp/serve.js.map +1 -0
  82. package/dist/cli/commands/mcp/setup.d.ts +1 -0
  83. package/dist/cli/commands/mcp/setup.js +83 -0
  84. package/dist/cli/commands/mcp/setup.js.map +1 -0
  85. package/dist/cli/commands/me.d.ts +2 -0
  86. package/dist/cli/commands/me.js +85 -0
  87. package/dist/cli/commands/me.js.map +1 -0
  88. package/dist/cli/commands/move.d.ts +2 -0
  89. package/dist/cli/commands/move.js +81 -0
  90. package/dist/cli/commands/move.js.map +1 -0
  91. package/dist/cli/commands/new.d.ts +2 -0
  92. package/dist/cli/commands/new.js +222 -0
  93. package/dist/cli/commands/new.js.map +1 -0
  94. package/dist/cli/commands/open.d.ts +2 -0
  95. package/dist/cli/commands/open.js +43 -0
  96. package/dist/cli/commands/open.js.map +1 -0
  97. package/dist/cli/commands/period.d.ts +10 -0
  98. package/dist/cli/commands/period.js +165 -0
  99. package/dist/cli/commands/period.js.map +1 -0
  100. package/dist/cli/commands/profile.d.ts +2 -0
  101. package/dist/cli/commands/profile.js +133 -0
  102. package/dist/cli/commands/profile.js.map +1 -0
  103. package/dist/cli/commands/queue.d.ts +2 -0
  104. package/dist/cli/commands/queue.js +582 -0
  105. package/dist/cli/commands/queue.js.map +1 -0
  106. package/dist/cli/commands/remote.d.ts +10 -0
  107. package/dist/cli/commands/remote.js +3142 -0
  108. package/dist/cli/commands/remote.js.map +1 -0
  109. package/dist/cli/commands/rm.d.ts +2 -0
  110. package/dist/cli/commands/rm.js +63 -0
  111. package/dist/cli/commands/rm.js.map +1 -0
  112. package/dist/cli/commands/set.d.ts +2 -0
  113. package/dist/cli/commands/set.js +139 -0
  114. package/dist/cli/commands/set.js.map +1 -0
  115. package/dist/cli/commands/split.d.ts +2 -0
  116. package/dist/cli/commands/split.js +90 -0
  117. package/dist/cli/commands/split.js.map +1 -0
  118. package/dist/cli/commands/task.d.ts +2 -0
  119. package/dist/cli/commands/task.js +298 -0
  120. package/dist/cli/commands/task.js.map +1 -0
  121. package/dist/cli/commands/team.d.ts +2 -0
  122. package/dist/cli/commands/team.js +114 -0
  123. package/dist/cli/commands/team.js.map +1 -0
  124. package/dist/cli/commands/template.d.ts +2 -0
  125. package/dist/cli/commands/template.js +338 -0
  126. package/dist/cli/commands/template.js.map +1 -0
  127. package/dist/cli/commands/ui.d.ts +2 -0
  128. package/dist/cli/commands/ui.js +98 -0
  129. package/dist/cli/commands/ui.js.map +1 -0
  130. package/dist/cli/commands/upstream.d.ts +2 -0
  131. package/dist/cli/commands/upstream.js +218 -0
  132. package/dist/cli/commands/upstream.js.map +1 -0
  133. package/dist/cli/context.d.ts +24 -0
  134. package/dist/cli/context.js +52 -0
  135. package/dist/cli/context.js.map +1 -0
  136. package/dist/cli/index.d.ts +2 -0
  137. package/dist/cli/index.js +208 -0
  138. package/dist/cli/index.js.map +1 -0
  139. package/dist/cli/live.d.ts +71 -0
  140. package/dist/cli/live.js +182 -0
  141. package/dist/cli/live.js.map +1 -0
  142. package/dist/cli/plan.d.ts +28 -0
  143. package/dist/cli/plan.js +76 -0
  144. package/dist/cli/plan.js.map +1 -0
  145. package/dist/cli/prompt.d.ts +60 -0
  146. package/dist/cli/prompt.js +185 -0
  147. package/dist/cli/prompt.js.map +1 -0
  148. package/dist/cli/ui.d.ts +65 -0
  149. package/dist/cli/ui.js +79 -0
  150. package/dist/cli/ui.js.map +1 -0
  151. package/dist/core/board/dependency-rollup.d.ts +54 -0
  152. package/dist/core/board/dependency-rollup.js +72 -0
  153. package/dist/core/board/dependency-rollup.js.map +1 -0
  154. package/dist/core/board/flag-rollup.d.ts +33 -0
  155. package/dist/core/board/flag-rollup.js +56 -0
  156. package/dist/core/board/flag-rollup.js.map +1 -0
  157. package/dist/core/board/index.d.ts +21 -0
  158. package/dist/core/board/index.js +22 -0
  159. package/dist/core/board/index.js.map +1 -0
  160. package/dist/core/board/load/cache.d.ts +52 -0
  161. package/dist/core/board/load/cache.js +105 -0
  162. package/dist/core/board/load/cache.js.map +1 -0
  163. package/dist/core/board/load/fields.d.ts +33 -0
  164. package/dist/core/board/load/fields.js +154 -0
  165. package/dist/core/board/load/fields.js.map +1 -0
  166. package/dist/core/board/load/scan.d.ts +39 -0
  167. package/dist/core/board/load/scan.js +88 -0
  168. package/dist/core/board/load/scan.js.map +1 -0
  169. package/dist/core/board/load/tree.d.ts +10 -0
  170. package/dist/core/board/load/tree.js +114 -0
  171. package/dist/core/board/load/tree.js.map +1 -0
  172. package/dist/core/board/load.d.ts +69 -0
  173. package/dist/core/board/load.js +204 -0
  174. package/dist/core/board/load.js.map +1 -0
  175. package/dist/core/board/query.d.ts +126 -0
  176. package/dist/core/board/query.js +291 -0
  177. package/dist/core/board/query.js.map +1 -0
  178. package/dist/core/board/registry.d.ts +51 -0
  179. package/dist/core/board/registry.js +98 -0
  180. package/dist/core/board/registry.js.map +1 -0
  181. package/dist/core/board/remote-scopes.d.ts +71 -0
  182. package/dist/core/board/remote-scopes.js +103 -0
  183. package/dist/core/board/remote-scopes.js.map +1 -0
  184. package/dist/core/board/rollup.d.ts +32 -0
  185. package/dist/core/board/rollup.js +67 -0
  186. package/dist/core/board/rollup.js.map +1 -0
  187. package/dist/core/board/scope.d.ts +81 -0
  188. package/dist/core/board/scope.js +134 -0
  189. package/dist/core/board/scope.js.map +1 -0
  190. package/dist/core/board/simulate.d.ts +138 -0
  191. package/dist/core/board/simulate.js +141 -0
  192. package/dist/core/board/simulate.js.map +1 -0
  193. package/dist/core/board/tasks/index.d.ts +25 -0
  194. package/dist/core/board/tasks/index.js +26 -0
  195. package/dist/core/board/tasks/index.js.map +1 -0
  196. package/dist/core/board/tasks/ranking.d.ts +155 -0
  197. package/dist/core/board/tasks/ranking.js +374 -0
  198. package/dist/core/board/tasks/ranking.js.map +1 -0
  199. package/dist/core/board/tasks/roster.d.ts +42 -0
  200. package/dist/core/board/tasks/roster.js +82 -0
  201. package/dist/core/board/tasks/roster.js.map +1 -0
  202. package/dist/core/board/tasks.d.ts +1 -0
  203. package/dist/core/board/tasks.js +2 -0
  204. package/dist/core/board/tasks.js.map +1 -0
  205. package/dist/core/config/index.d.ts +9 -0
  206. package/dist/core/config/index.js +10 -0
  207. package/dist/core/config/index.js.map +1 -0
  208. package/dist/core/config/lookup.d.ts +114 -0
  209. package/dist/core/config/lookup.js +221 -0
  210. package/dist/core/config/lookup.js.map +1 -0
  211. package/dist/core/config/remote-blocks.d.ts +17 -0
  212. package/dist/core/config/remote-blocks.js +47 -0
  213. package/dist/core/config/remote-blocks.js.map +1 -0
  214. package/dist/core/config/schema.d.ts +10 -0
  215. package/dist/core/config/schema.js +451 -0
  216. package/dist/core/config/schema.js.map +1 -0
  217. package/dist/core/errors.d.ts +23 -0
  218. package/dist/core/errors.js +31 -0
  219. package/dist/core/errors.js.map +1 -0
  220. package/dist/core/gitsync/hosts.d.ts +40 -0
  221. package/dist/core/gitsync/hosts.js +115 -0
  222. package/dist/core/gitsync/hosts.js.map +1 -0
  223. package/dist/core/gitsync/index.d.ts +25 -0
  224. package/dist/core/gitsync/index.js +25 -0
  225. package/dist/core/gitsync/index.js.map +1 -0
  226. package/dist/core/gitsync/integrate.d.ts +72 -0
  227. package/dist/core/gitsync/integrate.js +115 -0
  228. package/dist/core/gitsync/integrate.js.map +1 -0
  229. package/dist/core/gitsync/repo.d.ts +61 -0
  230. package/dist/core/gitsync/repo.js +213 -0
  231. package/dist/core/gitsync/repo.js.map +1 -0
  232. package/dist/core/gitsync/run.d.ts +58 -0
  233. package/dist/core/gitsync/run.js +102 -0
  234. package/dist/core/gitsync/run.js.map +1 -0
  235. package/dist/core/gitsync/status.d.ts +59 -0
  236. package/dist/core/gitsync/status.js +81 -0
  237. package/dist/core/gitsync/status.js.map +1 -0
  238. package/dist/core/gitsync/sync.d.ts +111 -0
  239. package/dist/core/gitsync/sync.js +275 -0
  240. package/dist/core/gitsync/sync.js.map +1 -0
  241. package/dist/core/index.d.ts +31 -0
  242. package/dist/core/index.js +32 -0
  243. package/dist/core/index.js.map +1 -0
  244. package/dist/core/instructions/analyze.d.ts +70 -0
  245. package/dist/core/instructions/analyze.js +275 -0
  246. package/dist/core/instructions/analyze.js.map +1 -0
  247. package/dist/core/instructions/builtin.d.ts +21 -0
  248. package/dist/core/instructions/builtin.js +133 -0
  249. package/dist/core/instructions/builtin.js.map +1 -0
  250. package/dist/core/instructions/context.d.ts +155 -0
  251. package/dist/core/instructions/context.js +209 -0
  252. package/dist/core/instructions/context.js.map +1 -0
  253. package/dist/core/instructions/index.d.ts +29 -0
  254. package/dist/core/instructions/index.js +30 -0
  255. package/dist/core/instructions/index.js.map +1 -0
  256. package/dist/core/instructions/instructions.d.ts +90 -0
  257. package/dist/core/instructions/instructions.js +179 -0
  258. package/dist/core/instructions/instructions.js.map +1 -0
  259. package/dist/core/instructions/template.d.ts +108 -0
  260. package/dist/core/instructions/template.js +252 -0
  261. package/dist/core/instructions/template.js.map +1 -0
  262. package/dist/core/model/attributes.d.ts +16 -0
  263. package/dist/core/model/attributes.js +119 -0
  264. package/dist/core/model/attributes.js.map +1 -0
  265. package/dist/core/model/index.d.ts +10 -0
  266. package/dist/core/model/index.js +11 -0
  267. package/dist/core/model/index.js.map +1 -0
  268. package/dist/core/model/links.d.ts +34 -0
  269. package/dist/core/model/links.js +114 -0
  270. package/dist/core/model/links.js.map +1 -0
  271. package/dist/core/model/profile.d.ts +31 -0
  272. package/dist/core/model/profile.js +8 -0
  273. package/dist/core/model/profile.js.map +1 -0
  274. package/dist/core/model/types.d.ts +441 -0
  275. package/dist/core/model/types.js +167 -0
  276. package/dist/core/model/types.js.map +1 -0
  277. package/dist/core/model/zod.d.ts +6 -0
  278. package/dist/core/model/zod.js +11 -0
  279. package/dist/core/model/zod.js.map +1 -0
  280. package/dist/core/operations/board-index.d.ts +45 -0
  281. package/dist/core/operations/board-index.js +147 -0
  282. package/dist/core/operations/board-index.js.map +1 -0
  283. package/dist/core/operations/claim.d.ts +69 -0
  284. package/dist/core/operations/claim.js +115 -0
  285. package/dist/core/operations/claim.js.map +1 -0
  286. package/dist/core/operations/comment.d.ts +30 -0
  287. package/dist/core/operations/comment.js +46 -0
  288. package/dist/core/operations/comment.js.map +1 -0
  289. package/dist/core/operations/create.d.ts +82 -0
  290. package/dist/core/operations/create.js +306 -0
  291. package/dist/core/operations/create.js.map +1 -0
  292. package/dist/core/operations/flag.d.ts +58 -0
  293. package/dist/core/operations/flag.js +95 -0
  294. package/dist/core/operations/flag.js.map +1 -0
  295. package/dist/core/operations/git-sync.d.ts +148 -0
  296. package/dist/core/operations/git-sync.js +341 -0
  297. package/dist/core/operations/git-sync.js.map +1 -0
  298. package/dist/core/operations/index.d.ts +44 -0
  299. package/dist/core/operations/index.js +45 -0
  300. package/dist/core/operations/index.js.map +1 -0
  301. package/dist/core/operations/init.d.ts +25 -0
  302. package/dist/core/operations/init.js +122 -0
  303. package/dist/core/operations/init.js.map +1 -0
  304. package/dist/core/operations/link.d.ts +40 -0
  305. package/dist/core/operations/link.js +131 -0
  306. package/dist/core/operations/link.js.map +1 -0
  307. package/dist/core/operations/move.d.ts +43 -0
  308. package/dist/core/operations/move.js +103 -0
  309. package/dist/core/operations/move.js.map +1 -0
  310. package/dist/core/operations/profile.d.ts +23 -0
  311. package/dist/core/operations/profile.js +26 -0
  312. package/dist/core/operations/profile.js.map +1 -0
  313. package/dist/core/operations/remotes-off.d.ts +12 -0
  314. package/dist/core/operations/remotes-off.js +67 -0
  315. package/dist/core/operations/remotes-off.js.map +1 -0
  316. package/dist/core/operations/remove.d.ts +18 -0
  317. package/dist/core/operations/remove.js +114 -0
  318. package/dist/core/operations/remove.js.map +1 -0
  319. package/dist/core/operations/retype.d.ts +25 -0
  320. package/dist/core/operations/retype.js +59 -0
  321. package/dist/core/operations/retype.js.map +1 -0
  322. package/dist/core/operations/rollup.d.ts +74 -0
  323. package/dist/core/operations/rollup.js +121 -0
  324. package/dist/core/operations/rollup.js.map +1 -0
  325. package/dist/core/operations/shared.d.ts +133 -0
  326. package/dist/core/operations/shared.js +383 -0
  327. package/dist/core/operations/shared.js.map +1 -0
  328. package/dist/core/operations/update.d.ts +43 -0
  329. package/dist/core/operations/update.js +161 -0
  330. package/dist/core/operations/update.js.map +1 -0
  331. package/dist/core/operations/user.d.ts +27 -0
  332. package/dist/core/operations/user.js +68 -0
  333. package/dist/core/operations/user.js.map +1 -0
  334. package/dist/core/profile/current.d.ts +35 -0
  335. package/dist/core/profile/current.js +31 -0
  336. package/dist/core/profile/current.js.map +1 -0
  337. package/dist/core/profile/index.d.ts +14 -0
  338. package/dist/core/profile/index.js +15 -0
  339. package/dist/core/profile/index.js.map +1 -0
  340. package/dist/core/profile/schema.d.ts +9 -0
  341. package/dist/core/profile/schema.js +100 -0
  342. package/dist/core/profile/schema.js.map +1 -0
  343. package/dist/core/storage/activity.d.ts +78 -0
  344. package/dist/core/storage/activity.js +131 -0
  345. package/dist/core/storage/activity.js.map +1 -0
  346. package/dist/core/storage/atomic.d.ts +34 -0
  347. package/dist/core/storage/atomic.js +117 -0
  348. package/dist/core/storage/atomic.js.map +1 -0
  349. package/dist/core/storage/comments.d.ts +39 -0
  350. package/dist/core/storage/comments.js +88 -0
  351. package/dist/core/storage/comments.js.map +1 -0
  352. package/dist/core/storage/document.d.ts +16 -0
  353. package/dist/core/storage/document.js +98 -0
  354. package/dist/core/storage/document.js.map +1 -0
  355. package/dist/core/storage/frontmatter.d.ts +16 -0
  356. package/dist/core/storage/frontmatter.js +33 -0
  357. package/dist/core/storage/frontmatter.js.map +1 -0
  358. package/dist/core/storage/git.d.ts +8 -0
  359. package/dist/core/storage/git.js +48 -0
  360. package/dist/core/storage/git.js.map +1 -0
  361. package/dist/core/storage/index.d.ts +27 -0
  362. package/dist/core/storage/index.js +28 -0
  363. package/dist/core/storage/index.js.map +1 -0
  364. package/dist/core/storage/local.d.ts +57 -0
  365. package/dist/core/storage/local.js +133 -0
  366. package/dist/core/storage/local.js.map +1 -0
  367. package/dist/core/storage/lock.d.ts +85 -0
  368. package/dist/core/storage/lock.js +364 -0
  369. package/dist/core/storage/lock.js.map +1 -0
  370. package/dist/core/storage/paths.d.ts +125 -0
  371. package/dist/core/storage/paths.js +202 -0
  372. package/dist/core/storage/paths.js.map +1 -0
  373. package/dist/core/storage/state.d.ts +32 -0
  374. package/dist/core/storage/state.js +71 -0
  375. package/dist/core/storage/state.js.map +1 -0
  376. package/dist/core/storage/templates.d.ts +29 -0
  377. package/dist/core/storage/templates.js +62 -0
  378. package/dist/core/storage/templates.js.map +1 -0
  379. package/dist/core/storage/views.d.ts +18 -0
  380. package/dist/core/storage/views.js +62 -0
  381. package/dist/core/storage/views.js.map +1 -0
  382. package/dist/core/validation/check.d.ts +4 -0
  383. package/dist/core/validation/check.js +22 -0
  384. package/dist/core/validation/check.js.map +1 -0
  385. package/dist/core/validation/checks/collection.d.ts +4 -0
  386. package/dist/core/validation/checks/collection.js +152 -0
  387. package/dist/core/validation/checks/collection.js.map +1 -0
  388. package/dist/core/validation/checks/counters.d.ts +3 -0
  389. package/dist/core/validation/checks/counters.js +23 -0
  390. package/dist/core/validation/checks/counters.js.map +1 -0
  391. package/dist/core/validation/checks/dependencies.d.ts +3 -0
  392. package/dist/core/validation/checks/dependencies.js +58 -0
  393. package/dist/core/validation/checks/dependencies.js.map +1 -0
  394. package/dist/core/validation/checks/gitignore.d.ts +10 -0
  395. package/dist/core/validation/checks/gitignore.js +22 -0
  396. package/dist/core/validation/checks/gitignore.js.map +1 -0
  397. package/dist/core/validation/checks/index-file.d.ts +8 -0
  398. package/dist/core/validation/checks/index-file.js +26 -0
  399. package/dist/core/validation/checks/index-file.js.map +1 -0
  400. package/dist/core/validation/checks/index.d.ts +20 -0
  401. package/dist/core/validation/checks/index.js +21 -0
  402. package/dist/core/validation/checks/index.js.map +1 -0
  403. package/dist/core/validation/checks/issues.d.ts +3 -0
  404. package/dist/core/validation/checks/issues.js +152 -0
  405. package/dist/core/validation/checks/issues.js.map +1 -0
  406. package/dist/core/validation/checks/periods.d.ts +3 -0
  407. package/dist/core/validation/checks/periods.js +89 -0
  408. package/dist/core/validation/checks/periods.js.map +1 -0
  409. package/dist/core/validation/checks/remotes.d.ts +20 -0
  410. package/dist/core/validation/checks/remotes.js +42 -0
  411. package/dist/core/validation/checks/remotes.js.map +1 -0
  412. package/dist/core/validation/checks/resources.d.ts +3 -0
  413. package/dist/core/validation/checks/resources.js +77 -0
  414. package/dist/core/validation/checks/resources.js.map +1 -0
  415. package/dist/core/validation/checks/rollup.d.ts +27 -0
  416. package/dist/core/validation/checks/rollup.js +53 -0
  417. package/dist/core/validation/checks/rollup.js.map +1 -0
  418. package/dist/core/validation/checks/squads.d.ts +3 -0
  419. package/dist/core/validation/checks/squads.js +42 -0
  420. package/dist/core/validation/checks/squads.js.map +1 -0
  421. package/dist/core/validation/checks/templates.d.ts +14 -0
  422. package/dist/core/validation/checks/templates.js +119 -0
  423. package/dist/core/validation/checks/templates.js.map +1 -0
  424. package/dist/core/validation/fix.d.ts +7 -0
  425. package/dist/core/validation/fix.js +273 -0
  426. package/dist/core/validation/fix.js.map +1 -0
  427. package/dist/core/validation/index.d.ts +7 -0
  428. package/dist/core/validation/index.js +8 -0
  429. package/dist/core/validation/index.js.map +1 -0
  430. package/dist/core/validation/shared.d.ts +47 -0
  431. package/dist/core/validation/shared.js +66 -0
  432. package/dist/core/validation/shared.js.map +1 -0
  433. package/dist/mcp/context.d.ts +70 -0
  434. package/dist/mcp/context.js +110 -0
  435. package/dist/mcp/context.js.map +1 -0
  436. package/dist/mcp/index.d.ts +49 -0
  437. package/dist/mcp/index.js +90 -0
  438. package/dist/mcp/index.js.map +1 -0
  439. package/dist/mcp/reply.d.ts +28 -0
  440. package/dist/mcp/reply.js +34 -0
  441. package/dist/mcp/reply.js.map +1 -0
  442. package/dist/mcp/tools/plan/create.d.ts +3 -0
  443. package/dist/mcp/tools/plan/create.js +128 -0
  444. package/dist/mcp/tools/plan/create.js.map +1 -0
  445. package/dist/mcp/tools/plan/delete.d.ts +3 -0
  446. package/dist/mcp/tools/plan/delete.js +35 -0
  447. package/dist/mcp/tools/plan/delete.js.map +1 -0
  448. package/dist/mcp/tools/plan/graph.d.ts +3 -0
  449. package/dist/mcp/tools/plan/graph.js +53 -0
  450. package/dist/mcp/tools/plan/graph.js.map +1 -0
  451. package/dist/mcp/tools/plan/index.d.ts +15 -0
  452. package/dist/mcp/tools/plan/index.js +16 -0
  453. package/dist/mcp/tools/plan/index.js.map +1 -0
  454. package/dist/mcp/tools/plan/link.d.ts +3 -0
  455. package/dist/mcp/tools/plan/link.js +46 -0
  456. package/dist/mcp/tools/plan/link.js.map +1 -0
  457. package/dist/mcp/tools/plan/registrar.d.ts +10 -0
  458. package/dist/mcp/tools/plan/registrar.js +24 -0
  459. package/dist/mcp/tools/plan/registrar.js.map +1 -0
  460. package/dist/mcp/tools/plan/reshape.d.ts +3 -0
  461. package/dist/mcp/tools/plan/reshape.js +95 -0
  462. package/dist/mcp/tools/plan/reshape.js.map +1 -0
  463. package/dist/mcp/tools/plan/timeline.d.ts +3 -0
  464. package/dist/mcp/tools/plan/timeline.js +68 -0
  465. package/dist/mcp/tools/plan/timeline.js.map +1 -0
  466. package/dist/mcp/tools/plan/upstream.d.ts +14 -0
  467. package/dist/mcp/tools/plan/upstream.js +69 -0
  468. package/dist/mcp/tools/plan/upstream.js.map +1 -0
  469. package/dist/mcp/tools/plan.d.ts +1 -0
  470. package/dist/mcp/tools/plan.js +2 -0
  471. package/dist/mcp/tools/plan.js.map +1 -0
  472. package/dist/mcp/tools/read.d.ts +3 -0
  473. package/dist/mcp/tools/read.js +339 -0
  474. package/dist/mcp/tools/read.js.map +1 -0
  475. package/dist/mcp/tools/remote.d.ts +3 -0
  476. package/dist/mcp/tools/remote.js +254 -0
  477. package/dist/mcp/tools/remote.js.map +1 -0
  478. package/dist/mcp/tools/templates.d.ts +12 -0
  479. package/dist/mcp/tools/templates.js +165 -0
  480. package/dist/mcp/tools/templates.js.map +1 -0
  481. package/dist/mcp/tools/work.d.ts +16 -0
  482. package/dist/mcp/tools/work.js +359 -0
  483. package/dist/mcp/tools/work.js.map +1 -0
  484. package/dist/remote/accounts.d.ts +158 -0
  485. package/dist/remote/accounts.js +207 -0
  486. package/dist/remote/accounts.js.map +1 -0
  487. package/dist/remote/adopt.d.ts +139 -0
  488. package/dist/remote/adopt.js +181 -0
  489. package/dist/remote/adopt.js.map +1 -0
  490. package/dist/remote/anchor.d.ts +35 -0
  491. package/dist/remote/anchor.js +53 -0
  492. package/dist/remote/anchor.js.map +1 -0
  493. package/dist/remote/attributes.d.ts +103 -0
  494. package/dist/remote/attributes.js +245 -0
  495. package/dist/remote/attributes.js.map +1 -0
  496. package/dist/remote/audit.d.ts +112 -0
  497. package/dist/remote/audit.js +215 -0
  498. package/dist/remote/audit.js.map +1 -0
  499. package/dist/remote/capabilities.d.ts +267 -0
  500. package/dist/remote/capabilities.js +225 -0
  501. package/dist/remote/capabilities.js.map +1 -0
  502. package/dist/remote/check.d.ts +49 -0
  503. package/dist/remote/check.js +356 -0
  504. package/dist/remote/check.js.map +1 -0
  505. package/dist/remote/comments.d.ts +86 -0
  506. package/dist/remote/comments.js +87 -0
  507. package/dist/remote/comments.js.map +1 -0
  508. package/dist/remote/config-file.d.ts +237 -0
  509. package/dist/remote/config-file.js +640 -0
  510. package/dist/remote/config-file.js.map +1 -0
  511. package/dist/remote/conflicts.d.ts +110 -0
  512. package/dist/remote/conflicts.js +188 -0
  513. package/dist/remote/conflicts.js.map +1 -0
  514. package/dist/remote/connection-catalogue.d.ts +65 -0
  515. package/dist/remote/connection-catalogue.js +66 -0
  516. package/dist/remote/connection-catalogue.js.map +1 -0
  517. package/dist/remote/connection.d.ts +84 -0
  518. package/dist/remote/connection.js +229 -0
  519. package/dist/remote/connection.js.map +1 -0
  520. package/dist/remote/coverage.d.ts +65 -0
  521. package/dist/remote/coverage.js +244 -0
  522. package/dist/remote/coverage.js.map +1 -0
  523. package/dist/remote/credentials.d.ts +95 -0
  524. package/dist/remote/credentials.js +210 -0
  525. package/dist/remote/credentials.js.map +1 -0
  526. package/dist/remote/execute.d.ts +178 -0
  527. package/dist/remote/execute.js +1245 -0
  528. package/dist/remote/execute.js.map +1 -0
  529. package/dist/remote/fingerprint.d.ts +172 -0
  530. package/dist/remote/fingerprint.js +337 -0
  531. package/dist/remote/fingerprint.js.map +1 -0
  532. package/dist/remote/fixtures.d.ts +176 -0
  533. package/dist/remote/fixtures.js +432 -0
  534. package/dist/remote/fixtures.js.map +1 -0
  535. package/dist/remote/guard.d.ts +90 -0
  536. package/dist/remote/guard.js +83 -0
  537. package/dist/remote/guard.js.map +1 -0
  538. package/dist/remote/hierarchy.d.ts +141 -0
  539. package/dist/remote/hierarchy.js +129 -0
  540. package/dist/remote/hierarchy.js.map +1 -0
  541. package/dist/remote/index.d.ts +145 -0
  542. package/dist/remote/index.js +146 -0
  543. package/dist/remote/index.js.map +1 -0
  544. package/dist/remote/inspect.d.ts +103 -0
  545. package/dist/remote/inspect.js +152 -0
  546. package/dist/remote/inspect.js.map +1 -0
  547. package/dist/remote/labels.d.ts +75 -0
  548. package/dist/remote/labels.js +137 -0
  549. package/dist/remote/labels.js.map +1 -0
  550. package/dist/remote/ladder.d.ts +145 -0
  551. package/dist/remote/ladder.js +387 -0
  552. package/dist/remote/ladder.js.map +1 -0
  553. package/dist/remote/ledger.d.ts +97 -0
  554. package/dist/remote/ledger.js +148 -0
  555. package/dist/remote/ledger.js.map +1 -0
  556. package/dist/remote/lifecycle.d.ts +175 -0
  557. package/dist/remote/lifecycle.js +274 -0
  558. package/dist/remote/lifecycle.js.map +1 -0
  559. package/dist/remote/links.d.ts +411 -0
  560. package/dist/remote/links.js +748 -0
  561. package/dist/remote/links.js.map +1 -0
  562. package/dist/remote/managed-block.d.ts +182 -0
  563. package/dist/remote/managed-block.js +406 -0
  564. package/dist/remote/managed-block.js.map +1 -0
  565. package/dist/remote/managed-comment.d.ts +104 -0
  566. package/dist/remote/managed-comment.js +92 -0
  567. package/dist/remote/managed-comment.js.map +1 -0
  568. package/dist/remote/mapping.d.ts +282 -0
  569. package/dist/remote/mapping.js +336 -0
  570. package/dist/remote/mapping.js.map +1 -0
  571. package/dist/remote/merge.d.ts +172 -0
  572. package/dist/remote/merge.js +221 -0
  573. package/dist/remote/merge.js.map +1 -0
  574. package/dist/remote/periods.d.ts +209 -0
  575. package/dist/remote/periods.js +224 -0
  576. package/dist/remote/periods.js.map +1 -0
  577. package/dist/remote/plan.d.ts +671 -0
  578. package/dist/remote/plan.js +1210 -0
  579. package/dist/remote/plan.js.map +1 -0
  580. package/dist/remote/policy.d.ts +67 -0
  581. package/dist/remote/policy.js +67 -0
  582. package/dist/remote/policy.js.map +1 -0
  583. package/dist/remote/preflight.d.ts +112 -0
  584. package/dist/remote/preflight.js +342 -0
  585. package/dist/remote/preflight.js.map +1 -0
  586. package/dist/remote/prerequisites.d.ts +113 -0
  587. package/dist/remote/prerequisites.js +161 -0
  588. package/dist/remote/prerequisites.js.map +1 -0
  589. package/dist/remote/provider.d.ts +802 -0
  590. package/dist/remote/provider.js +27 -0
  591. package/dist/remote/provider.js.map +1 -0
  592. package/dist/remote/providers/github/config.d.ts +84 -0
  593. package/dist/remote/providers/github/config.js +161 -0
  594. package/dist/remote/providers/github/config.js.map +1 -0
  595. package/dist/remote/providers/github/connector.d.ts +33 -0
  596. package/dist/remote/providers/github/connector.js +774 -0
  597. package/dist/remote/providers/github/connector.js.map +1 -0
  598. package/dist/remote/providers/github/edges.d.ts +29 -0
  599. package/dist/remote/providers/github/edges.js +56 -0
  600. package/dist/remote/providers/github/edges.js.map +1 -0
  601. package/dist/remote/providers/github/hierarchy.d.ts +21 -0
  602. package/dist/remote/providers/github/hierarchy.js +46 -0
  603. package/dist/remote/providers/github/hierarchy.js.map +1 -0
  604. package/dist/remote/providers/github/index.d.ts +26 -0
  605. package/dist/remote/providers/github/index.js +69 -0
  606. package/dist/remote/providers/github/index.js.map +1 -0
  607. package/dist/remote/providers/github/project-iteration.d.ts +71 -0
  608. package/dist/remote/providers/github/project-iteration.js +203 -0
  609. package/dist/remote/providers/github/project-iteration.js.map +1 -0
  610. package/dist/remote/providers/github/project-provision.d.ts +130 -0
  611. package/dist/remote/providers/github/project-provision.js +247 -0
  612. package/dist/remote/providers/github/project-provision.js.map +1 -0
  613. package/dist/remote/providers/github/project-status.d.ts +115 -0
  614. package/dist/remote/providers/github/project-status.js +317 -0
  615. package/dist/remote/providers/github/project-status.js.map +1 -0
  616. package/dist/remote/providers/github/projects.d.ts +181 -0
  617. package/dist/remote/providers/github/projects.js +481 -0
  618. package/dist/remote/providers/github/projects.js.map +1 -0
  619. package/dist/remote/providers/github/translator.d.ts +103 -0
  620. package/dist/remote/providers/github/translator.js +400 -0
  621. package/dist/remote/providers/github/translator.js.map +1 -0
  622. package/dist/remote/providers/jira/config.d.ts +96 -0
  623. package/dist/remote/providers/jira/config.js +200 -0
  624. package/dist/remote/providers/jira/config.js.map +1 -0
  625. package/dist/remote/providers/jira/connector.d.ts +42 -0
  626. package/dist/remote/providers/jira/connector.js +1688 -0
  627. package/dist/remote/providers/jira/connector.js.map +1 -0
  628. package/dist/remote/providers/jira/fields.d.ts +292 -0
  629. package/dist/remote/providers/jira/fields.js +463 -0
  630. package/dist/remote/providers/jira/fields.js.map +1 -0
  631. package/dist/remote/providers/jira/hierarchy.d.ts +28 -0
  632. package/dist/remote/providers/jira/hierarchy.js +60 -0
  633. package/dist/remote/providers/jira/hierarchy.js.map +1 -0
  634. package/dist/remote/providers/jira/index.d.ts +29 -0
  635. package/dist/remote/providers/jira/index.js +100 -0
  636. package/dist/remote/providers/jira/index.js.map +1 -0
  637. package/dist/remote/providers/jira/links.d.ts +41 -0
  638. package/dist/remote/providers/jira/links.js +102 -0
  639. package/dist/remote/providers/jira/links.js.map +1 -0
  640. package/dist/remote/providers/jira/sprints.d.ts +80 -0
  641. package/dist/remote/providers/jira/sprints.js +107 -0
  642. package/dist/remote/providers/jira/sprints.js.map +1 -0
  643. package/dist/remote/providers/jira/translator.d.ts +61 -0
  644. package/dist/remote/providers/jira/translator.js +382 -0
  645. package/dist/remote/providers/jira/translator.js.map +1 -0
  646. package/dist/remote/providers/jira/types.d.ts +112 -0
  647. package/dist/remote/providers/jira/types.js +160 -0
  648. package/dist/remote/providers/jira/types.js.map +1 -0
  649. package/dist/remote/providers/jira/vocabulary.d.ts +55 -0
  650. package/dist/remote/providers/jira/vocabulary.js +91 -0
  651. package/dist/remote/providers/jira/vocabulary.js.map +1 -0
  652. package/dist/remote/providers/jsonfile/config.d.ts +61 -0
  653. package/dist/remote/providers/jsonfile/config.js +83 -0
  654. package/dist/remote/providers/jsonfile/config.js.map +1 -0
  655. package/dist/remote/providers/jsonfile/connector.d.ts +34 -0
  656. package/dist/remote/providers/jsonfile/connector.js +251 -0
  657. package/dist/remote/providers/jsonfile/connector.js.map +1 -0
  658. package/dist/remote/providers/jsonfile/index.d.ts +38 -0
  659. package/dist/remote/providers/jsonfile/index.js +90 -0
  660. package/dist/remote/providers/jsonfile/index.js.map +1 -0
  661. package/dist/remote/providers/jsonfile/store.d.ts +59 -0
  662. package/dist/remote/providers/jsonfile/store.js +48 -0
  663. package/dist/remote/providers/jsonfile/store.js.map +1 -0
  664. package/dist/remote/providers/jsonfile/translator.d.ts +54 -0
  665. package/dist/remote/providers/jsonfile/translator.js +199 -0
  666. package/dist/remote/providers/jsonfile/translator.js.map +1 -0
  667. package/dist/remote/providers/linear/config.d.ts +83 -0
  668. package/dist/remote/providers/linear/config.js +140 -0
  669. package/dist/remote/providers/linear/config.js.map +1 -0
  670. package/dist/remote/providers/linear/connector.d.ts +36 -0
  671. package/dist/remote/providers/linear/connector.js +438 -0
  672. package/dist/remote/providers/linear/connector.js.map +1 -0
  673. package/dist/remote/providers/linear/estimate.d.ts +63 -0
  674. package/dist/remote/providers/linear/estimate.js +112 -0
  675. package/dist/remote/providers/linear/estimate.js.map +1 -0
  676. package/dist/remote/providers/linear/index.d.ts +31 -0
  677. package/dist/remote/providers/linear/index.js +75 -0
  678. package/dist/remote/providers/linear/index.js.map +1 -0
  679. package/dist/remote/providers/linear/labels.d.ts +51 -0
  680. package/dist/remote/providers/linear/labels.js +129 -0
  681. package/dist/remote/providers/linear/labels.js.map +1 -0
  682. package/dist/remote/providers/linear/states.d.ts +97 -0
  683. package/dist/remote/providers/linear/states.js +124 -0
  684. package/dist/remote/providers/linear/states.js.map +1 -0
  685. package/dist/remote/providers/linear/translator.d.ts +48 -0
  686. package/dist/remote/providers/linear/translator.js +343 -0
  687. package/dist/remote/providers/linear/translator.js.map +1 -0
  688. package/dist/remote/providers/linear/vocabulary.d.ts +27 -0
  689. package/dist/remote/providers/linear/vocabulary.js +42 -0
  690. package/dist/remote/providers/linear/vocabulary.js.map +1 -0
  691. package/dist/remote/provision.d.ts +45 -0
  692. package/dist/remote/provision.js +81 -0
  693. package/dist/remote/provision.js.map +1 -0
  694. package/dist/remote/pull.d.ts +52 -0
  695. package/dist/remote/pull.js +116 -0
  696. package/dist/remote/pull.js.map +1 -0
  697. package/dist/remote/readiness.d.ts +67 -0
  698. package/dist/remote/readiness.js +336 -0
  699. package/dist/remote/readiness.js.map +1 -0
  700. package/dist/remote/rebase.d.ts +157 -0
  701. package/dist/remote/rebase.js +255 -0
  702. package/dist/remote/rebase.js.map +1 -0
  703. package/dist/remote/reconcile.d.ts +115 -0
  704. package/dist/remote/reconcile.js +140 -0
  705. package/dist/remote/reconcile.js.map +1 -0
  706. package/dist/remote/redact.d.ts +70 -0
  707. package/dist/remote/redact.js +132 -0
  708. package/dist/remote/redact.js.map +1 -0
  709. package/dist/remote/registry.d.ts +32 -0
  710. package/dist/remote/registry.js +54 -0
  711. package/dist/remote/registry.js.map +1 -0
  712. package/dist/remote/remotes.d.ts +94 -0
  713. package/dist/remote/remotes.js +182 -0
  714. package/dist/remote/remotes.js.map +1 -0
  715. package/dist/remote/render.d.ts +147 -0
  716. package/dist/remote/render.js +683 -0
  717. package/dist/remote/render.js.map +1 -0
  718. package/dist/remote/report.d.ts +63 -0
  719. package/dist/remote/report.js +345 -0
  720. package/dist/remote/report.js.map +1 -0
  721. package/dist/remote/resolutions.d.ts +115 -0
  722. package/dist/remote/resolutions.js +217 -0
  723. package/dist/remote/resolutions.js.map +1 -0
  724. package/dist/remote/scaffold.d.ts +134 -0
  725. package/dist/remote/scaffold.js +370 -0
  726. package/dist/remote/scaffold.js.map +1 -0
  727. package/dist/remote/scope.d.ts +57 -0
  728. package/dist/remote/scope.js +91 -0
  729. package/dist/remote/scope.js.map +1 -0
  730. package/dist/remote/selection.d.ts +38 -0
  731. package/dist/remote/selection.js +50 -0
  732. package/dist/remote/selection.js.map +1 -0
  733. package/dist/remote/shape.d.ts +141 -0
  734. package/dist/remote/shape.js +220 -0
  735. package/dist/remote/shape.js.map +1 -0
  736. package/dist/remote/status.d.ts +104 -0
  737. package/dist/remote/status.js +238 -0
  738. package/dist/remote/status.js.map +1 -0
  739. package/dist/remote/sync.d.ts +182 -0
  740. package/dist/remote/sync.js +523 -0
  741. package/dist/remote/sync.js.map +1 -0
  742. package/dist/remote/transport/budget.d.ts +48 -0
  743. package/dist/remote/transport/budget.js +68 -0
  744. package/dist/remote/transport/budget.js.map +1 -0
  745. package/dist/remote/transport/connector.d.ts +115 -0
  746. package/dist/remote/transport/connector.js +21 -0
  747. package/dist/remote/transport/connector.js.map +1 -0
  748. package/dist/remote/transport/error.d.ts +88 -0
  749. package/dist/remote/transport/error.js +196 -0
  750. package/dist/remote/transport/error.js.map +1 -0
  751. package/dist/remote/transport/gh.d.ts +20 -0
  752. package/dist/remote/transport/gh.js +41 -0
  753. package/dist/remote/transport/gh.js.map +1 -0
  754. package/dist/remote/transport/graphql.d.ts +25 -0
  755. package/dist/remote/transport/graphql.js +81 -0
  756. package/dist/remote/transport/graphql.js.map +1 -0
  757. package/dist/remote/transport/http.d.ts +47 -0
  758. package/dist/remote/transport/http.js +195 -0
  759. package/dist/remote/transport/http.js.map +1 -0
  760. package/dist/remote/transport/index.d.ts +18 -0
  761. package/dist/remote/transport/index.js +19 -0
  762. package/dist/remote/transport/index.js.map +1 -0
  763. package/dist/remote/transport/process.d.ts +39 -0
  764. package/dist/remote/transport/process.js +121 -0
  765. package/dist/remote/transport/process.js.map +1 -0
  766. package/dist/remote/transport/rest.d.ts +22 -0
  767. package/dist/remote/transport/rest.js +57 -0
  768. package/dist/remote/transport/rest.js.map +1 -0
  769. package/dist/remote/transport/retry.d.ts +91 -0
  770. package/dist/remote/transport/retry.js +138 -0
  771. package/dist/remote/transport/retry.js.map +1 -0
  772. package/dist/remote/transport-error.d.ts +19 -0
  773. package/dist/remote/transport-error.js +22 -0
  774. package/dist/remote/transport-error.js.map +1 -0
  775. package/dist/remote/vocabulary.d.ts +126 -0
  776. package/dist/remote/vocabulary.js +57 -0
  777. package/dist/remote/vocabulary.js.map +1 -0
  778. package/dist/runner/config.d.ts +7 -0
  779. package/dist/runner/config.js +61 -0
  780. package/dist/runner/config.js.map +1 -0
  781. package/dist/runner/git.d.ts +19 -0
  782. package/dist/runner/git.js +26 -0
  783. package/dist/runner/git.js.map +1 -0
  784. package/dist/runner/index.d.ts +20 -0
  785. package/dist/runner/index.js +21 -0
  786. package/dist/runner/index.js.map +1 -0
  787. package/dist/runner/loop.d.ts +46 -0
  788. package/dist/runner/loop.js +243 -0
  789. package/dist/runner/loop.js.map +1 -0
  790. package/dist/runner/pi.d.ts +39 -0
  791. package/dist/runner/pi.js +276 -0
  792. package/dist/runner/pi.js.map +1 -0
  793. package/dist/runner/shell.d.ts +44 -0
  794. package/dist/runner/shell.js +174 -0
  795. package/dist/runner/shell.js.map +1 -0
  796. package/dist/runner/stats.d.ts +19 -0
  797. package/dist/runner/stats.js +58 -0
  798. package/dist/runner/stats.js.map +1 -0
  799. package/dist/runner/types.d.ts +218 -0
  800. package/dist/runner/types.js +37 -0
  801. package/dist/runner/types.js.map +1 -0
  802. package/dist/server/git.d.ts +8 -0
  803. package/dist/server/git.js +50 -0
  804. package/dist/server/git.js.map +1 -0
  805. package/dist/server/http/respond.d.ts +13 -0
  806. package/dist/server/http/respond.js +59 -0
  807. package/dist/server/http/respond.js.map +1 -0
  808. package/dist/server/http/router.d.ts +27 -0
  809. package/dist/server/http/router.js +48 -0
  810. package/dist/server/http/router.js.map +1 -0
  811. package/dist/server/http/static.d.ts +14 -0
  812. package/dist/server/http/static.js +55 -0
  813. package/dist/server/http/static.js.map +1 -0
  814. package/dist/server/index.d.ts +58 -0
  815. package/dist/server/index.js +124 -0
  816. package/dist/server/index.js.map +1 -0
  817. package/dist/server/routes/board.d.ts +8 -0
  818. package/dist/server/routes/board.js +19 -0
  819. package/dist/server/routes/board.js.map +1 -0
  820. package/dist/server/routes/comments.d.ts +13 -0
  821. package/dist/server/routes/comments.js +36 -0
  822. package/dist/server/routes/comments.js.map +1 -0
  823. package/dist/server/routes/flags.d.ts +16 -0
  824. package/dist/server/routes/flags.js +37 -0
  825. package/dist/server/routes/flags.js.map +1 -0
  826. package/dist/server/routes/git.d.ts +13 -0
  827. package/dist/server/routes/git.js +84 -0
  828. package/dist/server/routes/git.js.map +1 -0
  829. package/dist/server/routes/remotes.d.ts +36 -0
  830. package/dist/server/routes/remotes.js +749 -0
  831. package/dist/server/routes/remotes.js.map +1 -0
  832. package/dist/server/routes/views.d.ts +10 -0
  833. package/dist/server/routes/views.js +63 -0
  834. package/dist/server/routes/views.js.map +1 -0
  835. package/dist/server/views/schema.d.ts +2 -0
  836. package/dist/server/views/schema.js +121 -0
  837. package/dist/server/views/schema.js.map +1 -0
  838. package/dist/server/views/store.d.ts +17 -0
  839. package/dist/server/views/store.js +67 -0
  840. package/dist/server/views/store.js.map +1 -0
  841. package/dist/shared/adf.d.ts +83 -0
  842. package/dist/shared/adf.js +795 -0
  843. package/dist/shared/adf.js.map +1 -0
  844. package/dist/shared/blocking.d.ts +130 -0
  845. package/dist/shared/blocking.js +179 -0
  846. package/dist/shared/blocking.js.map +1 -0
  847. package/dist/shared/changes.d.ts +100 -0
  848. package/dist/shared/changes.js +112 -0
  849. package/dist/shared/changes.js.map +1 -0
  850. package/dist/shared/cohesion.d.ts +75 -0
  851. package/dist/shared/cohesion.js +132 -0
  852. package/dist/shared/cohesion.js.map +1 -0
  853. package/dist/shared/dependency-rollup.d.ts +91 -0
  854. package/dist/shared/dependency-rollup.js +132 -0
  855. package/dist/shared/dependency-rollup.js.map +1 -0
  856. package/dist/shared/errors.d.ts +23 -0
  857. package/dist/shared/errors.js +24 -0
  858. package/dist/shared/errors.js.map +1 -0
  859. package/dist/shared/flag-rollup.d.ts +88 -0
  860. package/dist/shared/flag-rollup.js +119 -0
  861. package/dist/shared/flag-rollup.js.map +1 -0
  862. package/dist/shared/git-sync.d.ts +90 -0
  863. package/dist/shared/git-sync.js +9 -0
  864. package/dist/shared/git-sync.js.map +1 -0
  865. package/dist/shared/index.d.ts +40 -0
  866. package/dist/shared/index.js +41 -0
  867. package/dist/shared/index.js.map +1 -0
  868. package/dist/shared/model.d.ts +218 -0
  869. package/dist/shared/model.js +95 -0
  870. package/dist/shared/model.js.map +1 -0
  871. package/dist/shared/period-query.d.ts +21 -0
  872. package/dist/shared/period-query.js +26 -0
  873. package/dist/shared/period-query.js.map +1 -0
  874. package/dist/shared/period-stance.d.ts +45 -0
  875. package/dist/shared/period-stance.js +50 -0
  876. package/dist/shared/period-stance.js.map +1 -0
  877. package/dist/shared/plans/breakdown.d.ts +66 -0
  878. package/dist/shared/plans/breakdown.js +186 -0
  879. package/dist/shared/plans/breakdown.js.map +1 -0
  880. package/dist/shared/plans/index.d.ts +21 -0
  881. package/dist/shared/plans/index.js +22 -0
  882. package/dist/shared/plans/index.js.map +1 -0
  883. package/dist/shared/plans/instantiate.d.ts +61 -0
  884. package/dist/shared/plans/instantiate.js +184 -0
  885. package/dist/shared/plans/instantiate.js.map +1 -0
  886. package/dist/shared/plans/reading.d.ts +79 -0
  887. package/dist/shared/plans/reading.js +149 -0
  888. package/dist/shared/plans/reading.js.map +1 -0
  889. package/dist/shared/plans/reparent.d.ts +54 -0
  890. package/dist/shared/plans/reparent.js +217 -0
  891. package/dist/shared/plans/reparent.js.map +1 -0
  892. package/dist/shared/plans/timeline.d.ts +93 -0
  893. package/dist/shared/plans/timeline.js +224 -0
  894. package/dist/shared/plans/timeline.js.map +1 -0
  895. package/dist/shared/plans/upstream.d.ts +67 -0
  896. package/dist/shared/plans/upstream.js +73 -0
  897. package/dist/shared/plans/upstream.js.map +1 -0
  898. package/dist/shared/remote-api.d.ts +413 -0
  899. package/dist/shared/remote-api.js +11 -0
  900. package/dist/shared/remote-api.js.map +1 -0
  901. package/dist/shared/remote-coverage.d.ts +120 -0
  902. package/dist/shared/remote-coverage.js +98 -0
  903. package/dist/shared/remote-coverage.js.map +1 -0
  904. package/dist/shared/remote-readiness.d.ts +162 -0
  905. package/dist/shared/remote-readiness.js +49 -0
  906. package/dist/shared/remote-readiness.js.map +1 -0
  907. package/dist/shared/remote-status.d.ts +268 -0
  908. package/dist/shared/remote-status.js +79 -0
  909. package/dist/shared/remote-status.js.map +1 -0
  910. package/dist/shared/rollup.d.ts +90 -0
  911. package/dist/shared/rollup.js +119 -0
  912. package/dist/shared/rollup.js.map +1 -0
  913. package/dist/shared/static.d.ts +65 -0
  914. package/dist/shared/static.js +107 -0
  915. package/dist/shared/static.js.map +1 -0
  916. package/dist/shared/template-params.d.ts +80 -0
  917. package/dist/shared/template-params.js +141 -0
  918. package/dist/shared/template-params.js.map +1 -0
  919. package/dist/shared/view.d.ts +105 -0
  920. package/dist/shared/view.js +44 -0
  921. package/dist/shared/view.js.map +1 -0
  922. package/dist/shared/work-unit.d.ts +34 -0
  923. package/dist/shared/work-unit.js +47 -0
  924. package/dist/shared/work-unit.js.map +1 -0
  925. package/dist/sync/apply.d.ts +21 -0
  926. package/dist/sync/apply.js +149 -0
  927. package/dist/sync/apply.js.map +1 -0
  928. package/dist/sync/dto.d.ts +9 -0
  929. package/dist/sync/dto.js +162 -0
  930. package/dist/sync/dto.js.map +1 -0
  931. package/dist/sync/index.d.ts +24 -0
  932. package/dist/sync/index.js +25 -0
  933. package/dist/sync/index.js.map +1 -0
  934. package/dist/sync/patch.d.ts +13 -0
  935. package/dist/sync/patch.js +212 -0
  936. package/dist/sync/patch.js.map +1 -0
  937. package/dist/sync/session.d.ts +31 -0
  938. package/dist/sync/session.js +55 -0
  939. package/dist/sync/session.js.map +1 -0
  940. package/dist/sync/static.d.ts +11 -0
  941. package/dist/sync/static.js +33 -0
  942. package/dist/sync/static.js.map +1 -0
  943. package/package.json +95 -4
  944. package/templates/blank.yml +71 -0
  945. package/templates/context/bug.md +107 -0
  946. package/templates/context/default.md +119 -0
  947. package/templates/context/epic.md +81 -0
  948. package/templates/context/feature.md +91 -0
  949. package/templates/context/research.md +87 -0
  950. package/templates/context/review.md +81 -0
  951. package/templates/context/story.md +94 -0
  952. package/templates/context/sub_task.md +108 -0
  953. package/templates/context/task.md +86 -0
  954. package/templates/context/test.md +73 -0
  955. package/templates/context/user_story.md +147 -0
  956. package/templates/kanban.yml +226 -0
  957. package/templates/scrum.yml +567 -0
  958. package/web/dist/assets/index-D0j8OnHq.js +35 -0
  959. package/web/dist/assets/index-DFL7v8aP.css +1 -0
  960. package/web/dist/index.html +13 -0
  961. package/web/dist-viewer/assets/index-Bcns6OuC.css +1 -0
  962. package/web/dist-viewer/assets/index-vVXzeiFo.js +7 -0
  963. package/web/dist-viewer/index.html +14 -0
@@ -0,0 +1,51 @@
1
+ import type { Template } from '../model/types.js';
2
+ import type { LoadedBoard } from './load.js';
3
+ /**
4
+ * Reading the template registry.
5
+ *
6
+ * The registry is a collection like any other, so loading, checking, moving and
7
+ * deleting come for free. What it adds is one distinction the other collections
8
+ * do not have: some of its documents are *containers* and the rest are the
9
+ * things somebody instantiates. Everything that depends on that distinction is
10
+ * here, so no front end has to re-derive it.
11
+ */
12
+ /**
13
+ * A template somebody can instantiate: one whose parent is a folder, or nothing.
14
+ *
15
+ * Anything else is *inside* a template — the three stories under a feature
16
+ * template are part of the feature, not three separate offers — and a folder is
17
+ * scaffolding. So this is exactly the list the registry shows and exactly the
18
+ * set of ids `instantiate` accepts.
19
+ */
20
+ export declare function isTemplateRoot(board: LoadedBoard, template: Template): boolean;
21
+ /** Every template that can be instantiated, in registry order. */
22
+ export declare function templateRoots(board: LoadedBoard): Template[];
23
+ /** Resolve a template by id, case-insensitively, so `tpl-3` finds `TPL-3`. */
24
+ export declare function findTemplate(board: LoadedBoard, id: string): Template | null;
25
+ /** A template and everything nested under it, parents first. */
26
+ export declare function templateSubtree(board: LoadedBoard, root: Template): Template[];
27
+ /**
28
+ * The folder path a template sits under, outermost first — "Delivery / Backend".
29
+ * What makes a listing of forty templates readable.
30
+ */
31
+ export declare function templatePath(board: LoadedBoard, template: Template): string[];
32
+ /**
33
+ * Why this template may not sit under that parent, or null when it may.
34
+ *
35
+ * The depth rules are the hierarchy's and are checked everywhere else; this is
36
+ * the one rule the registry adds. A folder stands in for a level nobody
37
+ * templatized, so it belongs beside templates and never inside one — a folder
38
+ * halfway down a feature template would be a level of the produced issue tree
39
+ * with nothing to put in it.
40
+ */
41
+ export declare function placementProblem(type: string, parent: {
42
+ type: string;
43
+ id: string;
44
+ } | null): string | null;
45
+ /** Throw when a placement breaks the rule above. */
46
+ export declare function requirePlacement(type: string, parent: {
47
+ type: string;
48
+ id: string;
49
+ } | null): void;
50
+ /** Resolve a template that must exist, with a message naming the registry. */
51
+ export declare function requireTemplate(board: LoadedBoard, id: string): Template;
@@ -0,0 +1,98 @@
1
+ import { BoardError } from '../errors.js';
2
+ import { TEMPLATE_FOLDER_TYPE, isFolderTemplate } from '../model/types.js';
3
+ import { subtreeOf } from './query.js';
4
+ /**
5
+ * Reading the template registry.
6
+ *
7
+ * The registry is a collection like any other, so loading, checking, moving and
8
+ * deleting come for free. What it adds is one distinction the other collections
9
+ * do not have: some of its documents are *containers* and the rest are the
10
+ * things somebody instantiates. Everything that depends on that distinction is
11
+ * here, so no front end has to re-derive it.
12
+ */
13
+ /**
14
+ * A template somebody can instantiate: one whose parent is a folder, or nothing.
15
+ *
16
+ * Anything else is *inside* a template — the three stories under a feature
17
+ * template are part of the feature, not three separate offers — and a folder is
18
+ * scaffolding. So this is exactly the list the registry shows and exactly the
19
+ * set of ids `instantiate` accepts.
20
+ */
21
+ export function isTemplateRoot(board, template) {
22
+ if (isFolderTemplate(template))
23
+ return false;
24
+ if (!template.parentId)
25
+ return true;
26
+ const parent = board.templatesById.get(template.parentId);
27
+ return parent ? isFolderTemplate(parent) : true;
28
+ }
29
+ /** Every template that can be instantiated, in registry order. */
30
+ export function templateRoots(board) {
31
+ return board.templates.filter((template) => isTemplateRoot(board, template));
32
+ }
33
+ /** Resolve a template by id, case-insensitively, so `tpl-3` finds `TPL-3`. */
34
+ export function findTemplate(board, id) {
35
+ const exact = board.templatesById.get(id);
36
+ if (exact)
37
+ return exact;
38
+ const wanted = id.toLowerCase();
39
+ return board.templates.find((template) => template.id.toLowerCase() === wanted) ?? null;
40
+ }
41
+ /** A template and everything nested under it, parents first. */
42
+ export function templateSubtree(board, root) {
43
+ return subtreeOf(board.templates, root);
44
+ }
45
+ /**
46
+ * The folder path a template sits under, outermost first — "Delivery / Backend".
47
+ * What makes a listing of forty templates readable.
48
+ */
49
+ export function templatePath(board, template) {
50
+ const names = [];
51
+ const seen = new Set([template.id]);
52
+ let current = template.parentId ? board.templatesById.get(template.parentId) : undefined;
53
+ while (current && !seen.has(current.id)) {
54
+ seen.add(current.id);
55
+ names.unshift(current.title);
56
+ current = current.parentId ? board.templatesById.get(current.parentId) : undefined;
57
+ }
58
+ return names;
59
+ }
60
+ /**
61
+ * Why this template may not sit under that parent, or null when it may.
62
+ *
63
+ * The depth rules are the hierarchy's and are checked everywhere else; this is
64
+ * the one rule the registry adds. A folder stands in for a level nobody
65
+ * templatized, so it belongs beside templates and never inside one — a folder
66
+ * halfway down a feature template would be a level of the produced issue tree
67
+ * with nothing to put in it.
68
+ */
69
+ export function placementProblem(type, parent) {
70
+ if (type !== TEMPLATE_FOLDER_TYPE)
71
+ return null;
72
+ if (parent && parent.type !== TEMPLATE_FOLDER_TYPE) {
73
+ return `A folder cannot sit inside the template ${parent.id}`;
74
+ }
75
+ return null;
76
+ }
77
+ /** Throw when a placement breaks the rule above. */
78
+ export function requirePlacement(type, parent) {
79
+ const problem = placementProblem(type, parent);
80
+ if (problem) {
81
+ throw new BoardError(problem, [
82
+ 'Folders group templates; only templates and other folders go inside one.',
83
+ ]);
84
+ }
85
+ }
86
+ /** Resolve a template that must exist, with a message naming the registry. */
87
+ export function requireTemplate(board, id) {
88
+ const template = findTemplate(board, id);
89
+ if (!template) {
90
+ throw new BoardError(`No template with id "${id}"`, [
91
+ board.templates.length
92
+ ? 'Run `lpm template list` to see the registry.'
93
+ : 'The registry is empty; add one with `lpm template new <type> -t "..."`.',
94
+ ]);
95
+ }
96
+ return template;
97
+ }
98
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/board/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Which documents each declared remote claims — and where two remotes claim
3
+ * the same ones.
4
+ *
5
+ * A remote mirrors a subtree (`scope: LP-10`) or, with no `scope`, the whole
6
+ * board. **Two remotes may never claim the same document.** A document
7
+ * mirrored to two trackers at once is filed twice, closed twice, and edited
8
+ * from two directions into a conflict nobody asked for — and no `on_delete`
9
+ * policy or three-way merge can dig it back out, because the two remotes have
10
+ * no idea the other exists.
11
+ *
12
+ * Half of that rule is already enforced where it can be answered from the
13
+ * config alone (`checkRemotes` in `config/schema.ts`): two equal scopes are
14
+ * the same subtree, and an absent scope contains every other. The other half
15
+ * needs the board tree, because "is LP-42 inside LP-10?" is a question about
16
+ * parenting, not about config — and that is this file. `config/schema.ts`
17
+ * says so in as many words and this is the check it points at.
18
+ *
19
+ * Pure: no disk, no network. It takes the issues and the declared scopes and
20
+ * returns a value, so `lpm check` (reporting a board that drifted into this
21
+ * state through a reparent, a hand edit or a merge) and `lpm remote add`
22
+ * (refusing to write one in the first place) enforce one rule rather than two
23
+ * that can disagree.
24
+ */
25
+ import type { Issue } from '../model/types.js';
26
+ /** One remote's claim, as the config declares it. */
27
+ export interface DeclaredScope {
28
+ /** The remote's name, for naming it in a message. */
29
+ name: string;
30
+ /** The scope id, or undefined for the whole board. */
31
+ scope: string | undefined;
32
+ }
33
+ /** Two remotes claiming the same documents, and why. */
34
+ export interface ScopeOverlap {
35
+ /** The remote whose scope contains the other's. */
36
+ outer: string;
37
+ /** The remote nested inside it. */
38
+ inner: string;
39
+ /** The outer remote's scope id (`undefined` — the whole board — never reaches here). */
40
+ outerScope: string;
41
+ /** The inner remote's scope id. */
42
+ innerScope: string;
43
+ }
44
+ /** A `scope:` naming a document the board does not have. */
45
+ export interface StaleScope {
46
+ name: string;
47
+ scope: string;
48
+ }
49
+ /**
50
+ * Every pair of declared remotes whose scopes claim the same documents through
51
+ * *nesting* — one scope sitting at or inside the other.
52
+ *
53
+ * Equal scopes and an absent scope are left to `config/schema.ts`, which
54
+ * refuses them before a board with them can load at all; reporting them again
55
+ * here would say the same thing twice in different words. A scope naming no
56
+ * document claims nothing and cannot overlap — `staleScopes` reports it
57
+ * instead.
58
+ *
59
+ * Pairs come back in declaration order, outer remote first.
60
+ */
61
+ export declare function scopeOverlaps(issues: readonly Issue[], remotes: readonly DeclaredScope[]): ScopeOverlap[];
62
+ /**
63
+ * Declared scopes naming a document the board does not have — a subtree that
64
+ * was deleted, renamed or never existed. Such a remote mirrors nothing, which
65
+ * is worth saying out loud before somebody wonders why a sync is empty.
66
+ */
67
+ export declare function staleScopes(issues: readonly Issue[], remotes: readonly DeclaredScope[]): StaleScope[];
68
+ /** The declared scopes of a board's remotes, in declaration order. */
69
+ export declare function declaredScopes(remotes: Record<string, {
70
+ scope?: string;
71
+ }>): DeclaredScope[];
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Which documents each declared remote claims — and where two remotes claim
3
+ * the same ones.
4
+ *
5
+ * A remote mirrors a subtree (`scope: LP-10`) or, with no `scope`, the whole
6
+ * board. **Two remotes may never claim the same document.** A document
7
+ * mirrored to two trackers at once is filed twice, closed twice, and edited
8
+ * from two directions into a conflict nobody asked for — and no `on_delete`
9
+ * policy or three-way merge can dig it back out, because the two remotes have
10
+ * no idea the other exists.
11
+ *
12
+ * Half of that rule is already enforced where it can be answered from the
13
+ * config alone (`checkRemotes` in `config/schema.ts`): two equal scopes are
14
+ * the same subtree, and an absent scope contains every other. The other half
15
+ * needs the board tree, because "is LP-42 inside LP-10?" is a question about
16
+ * parenting, not about config — and that is this file. `config/schema.ts`
17
+ * says so in as many words and this is the check it points at.
18
+ *
19
+ * Pure: no disk, no network. It takes the issues and the declared scopes and
20
+ * returns a value, so `lpm check` (reporting a board that drifted into this
21
+ * state through a reparent, a hand edit or a merge) and `lpm remote add`
22
+ * (refusing to write one in the first place) enforce one rule rather than two
23
+ * that can disagree.
24
+ */
25
+ /** Issue id → its parent's id, for walking ancestry upward. */
26
+ function parentIndex(issues) {
27
+ const parents = new Map();
28
+ for (const issue of issues)
29
+ parents.set(issue.id, issue.parentId ?? undefined);
30
+ return parents;
31
+ }
32
+ /**
33
+ * True when `ancestorId` is `id` itself or sits above it in the tree. The walk
34
+ * is bounded by the number of issues, so a parent cycle arriving by hand edit
35
+ * or merge terminates rather than hanging the check that would report it.
36
+ */
37
+ function isAtOrUnder(parents, id, ancestorId) {
38
+ let current = id;
39
+ for (let steps = 0; current !== undefined && steps <= parents.size; steps += 1) {
40
+ if (current === ancestorId)
41
+ return true;
42
+ current = parents.get(current);
43
+ }
44
+ return false;
45
+ }
46
+ /**
47
+ * Every pair of declared remotes whose scopes claim the same documents through
48
+ * *nesting* — one scope sitting at or inside the other.
49
+ *
50
+ * Equal scopes and an absent scope are left to `config/schema.ts`, which
51
+ * refuses them before a board with them can load at all; reporting them again
52
+ * here would say the same thing twice in different words. A scope naming no
53
+ * document claims nothing and cannot overlap — `staleScopes` reports it
54
+ * instead.
55
+ *
56
+ * Pairs come back in declaration order, outer remote first.
57
+ */
58
+ export function scopeOverlaps(issues, remotes) {
59
+ const known = new Set(issues.map((issue) => issue.id));
60
+ const scoped = remotes.filter((remote) => remote.scope !== undefined && known.has(remote.scope));
61
+ if (scoped.length < 2)
62
+ return [];
63
+ const parents = parentIndex(issues);
64
+ const overlaps = [];
65
+ for (let i = 0; i < scoped.length; i += 1) {
66
+ for (let j = i + 1; j < scoped.length; j += 1) {
67
+ const a = scoped[i];
68
+ const b = scoped[j];
69
+ if (a.scope === b.scope)
70
+ continue; // config/schema.ts already refuses this
71
+ const bInsideA = isAtOrUnder(parents, b.scope, a.scope);
72
+ const aInsideB = isAtOrUnder(parents, a.scope, b.scope);
73
+ if (!bInsideA && !aInsideB)
74
+ continue;
75
+ const outer = bInsideA ? a : b;
76
+ const inner = bInsideA ? b : a;
77
+ overlaps.push({
78
+ outer: outer.name,
79
+ inner: inner.name,
80
+ outerScope: outer.scope,
81
+ innerScope: inner.scope,
82
+ });
83
+ }
84
+ }
85
+ return overlaps;
86
+ }
87
+ /**
88
+ * Declared scopes naming a document the board does not have — a subtree that
89
+ * was deleted, renamed or never existed. Such a remote mirrors nothing, which
90
+ * is worth saying out loud before somebody wonders why a sync is empty.
91
+ */
92
+ export function staleScopes(issues, remotes) {
93
+ const known = new Set(issues.map((issue) => issue.id));
94
+ return remotes
95
+ .filter((remote) => remote.scope !== undefined)
96
+ .filter((remote) => !known.has(remote.scope))
97
+ .map((remote) => ({ name: remote.name, scope: remote.scope }));
98
+ }
99
+ /** The declared scopes of a board's remotes, in declaration order. */
100
+ export function declaredScopes(remotes) {
101
+ return Object.entries(remotes).map(([name, remote]) => ({ name, scope: remote.scope }));
102
+ }
103
+ //# sourceMappingURL=remote-scopes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-scopes.js","sourceRoot":"","sources":["../../../src/core/board/remote-scopes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Issue } from '../model/types.js';
2
+ import type { LoadedBoard } from './load.js';
3
+ /**
4
+ * Reading a board for the status roll-up: which parents disagree with the work
5
+ * inside them.
6
+ *
7
+ * Read-only, like the rest of `board/`. `operations/rollup.ts` is what writes
8
+ * the answer, and `validation/checks/rollup.ts` is what reports it.
9
+ *
10
+ * @see src/shared/rollup.ts for the rule itself and why it is that way.
11
+ */
12
+ /** An ancestor that has to move, resolved to the document a caller can write. */
13
+ export interface IssueRollup {
14
+ issue: Issue;
15
+ from: string;
16
+ to: string;
17
+ }
18
+ /**
19
+ * The ancestors of `issue` that its new status carries with it, nearest first.
20
+ *
21
+ * `issue` is the document as it now stands and `status` the status it now
22
+ * holds — pass both, because the board handle still shows what was there before
23
+ * the operation wrote, including the parent it sat under.
24
+ */
25
+ export declare function rollupsFor(board: LoadedBoard, issue: Issue, status: string): IssueRollup[];
26
+ /**
27
+ * Every parent on the board whose status disagrees with what is inside it.
28
+ *
29
+ * Deepest first, so one pass carries a closed story up through its feature to
30
+ * the epic above it, and the list can be written in the order it is returned.
31
+ */
32
+ export declare function boardRollups(board: LoadedBoard): IssueRollup[];
@@ -0,0 +1,67 @@
1
+ import { statusRulesFor } from '../config/lookup.js';
2
+ import { rollupsAcross, rollupsUpward } from '../../shared/rollup.js';
3
+ /**
4
+ * Adapt a `LoadedBoard` to the id-based lookup `src/shared/rollup.ts` reads.
5
+ *
6
+ * Both overlays carry facts that are true but not yet on the board handle: core
7
+ * operations write straight to disk, so the issue `moveNode` just closed is
8
+ * still open in memory, one it reparented in the same call still sits where it
9
+ * was, and one `createIssue` just wrote is not there at all. Anything not named
10
+ * in an overlay is read off the board.
11
+ */
12
+ function rollupLookupFor(board, status, parent) {
13
+ // `has`, not `??`: a node moved to the top level has a parent of `null`, and
14
+ // that is an answer rather than a miss.
15
+ const parentOf = (id) => parent.has(id) ? parent.get(id) : (board.byId.get(id)?.parentId ?? null);
16
+ // The overlay's own ids as well, so an issue written a moment ago counts
17
+ // among its parent's contents even though the handle has never seen it.
18
+ const ids = [...board.issues.map((issue) => issue.id), ...parent.keys()];
19
+ const children = new Map();
20
+ for (const id of new Set(ids)) {
21
+ const above = parentOf(id);
22
+ if (!above)
23
+ continue;
24
+ const list = children.get(above);
25
+ if (list)
26
+ list.push(id);
27
+ else
28
+ children.set(above, [id]);
29
+ }
30
+ return {
31
+ parentOf,
32
+ childIdsOf: (id) => children.get(id) ?? [],
33
+ statusOf: (id) => status.get(id) ?? board.byId.get(id)?.status ?? '',
34
+ };
35
+ }
36
+ function resolve(board, rollups) {
37
+ const out = [];
38
+ for (const rollup of rollups) {
39
+ const issue = board.byId.get(rollup.id);
40
+ if (issue)
41
+ out.push({ issue, from: rollup.from, to: rollup.to });
42
+ }
43
+ return out;
44
+ }
45
+ /**
46
+ * The ancestors of `issue` that its new status carries with it, nearest first.
47
+ *
48
+ * `issue` is the document as it now stands and `status` the status it now
49
+ * holds — pass both, because the board handle still shows what was there before
50
+ * the operation wrote, including the parent it sat under.
51
+ */
52
+ export function rollupsFor(board, issue, status) {
53
+ return resolve(board, rollupsUpward(issue.id, rollupLookupFor(board, new Map([[issue.id, status]]), new Map([[issue.id, issue.parentId]])), statusRulesFor(board.config)));
54
+ }
55
+ /**
56
+ * Every parent on the board whose status disagrees with what is inside it.
57
+ *
58
+ * Deepest first, so one pass carries a closed story up through its feature to
59
+ * the epic above it, and the list can be written in the order it is returned.
60
+ */
61
+ export function boardRollups(board) {
62
+ const ids = [...board.issues]
63
+ .sort((a, b) => b.depth - a.depth)
64
+ .map((issue) => issue.id);
65
+ return resolve(board, rollupsAcross(ids, rollupLookupFor(board, new Map(), new Map()), statusRulesFor(board.config)));
66
+ }
67
+ //# sourceMappingURL=rollup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollup.js","sourceRoot":"","sources":["../../../src/core/board/rollup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAoBtE;;;;;;;;GAQG;AACH,SAAS,eAAe,CACtB,KAAkB,EAClB,MAA2B,EAC3B,MAAkC;IAElC,6EAA6E;IAC7E,wCAAwC;IACxC,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAiB,EAAE,CAC7C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAC;IAE5E,yEAAyE;IACzE,wEAAwE;IACxE,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,KAAK,MAAM,EAAE,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;YACnB,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,OAAO;QACL,QAAQ;QACR,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;QAC1C,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,EAAE;KACrE,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,KAAkB,EAAE,OAAuB;IAC1D,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,KAAK;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,KAAkB,EAAE,KAAY,EAAE,MAAc;IACzE,OAAO,OAAO,CACZ,KAAK,EACL,aAAa,CACX,KAAK,CAAC,EAAE,EACR,eAAe,CACb,KAAK,EACL,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAC7B,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CACtC,EACD,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAC7B,CACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAkB;IAC7C,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;SAC1B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5B,OAAO,OAAO,CACZ,KAAK,EACL,aAAa,CACX,GAAG,EACH,eAAe,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,EAC5C,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAC7B,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,81 @@
1
+ import type { ProfileScope } from '../model/profile.js';
2
+ import type { Issue } from '../model/types.js';
3
+ import type { LoadedBoard } from './load.js';
4
+ /**
5
+ * Narrowing the board to one person's part of it.
6
+ *
7
+ * A `ProfileScope` names documents; a `ResolvedScope` is what that means on
8
+ * *this* board — the actual issues, the periods with their children folded in,
9
+ * and the names that matched nothing. Resolving once and asking many times is
10
+ * what keeps the filter cheap enough to sit inside `nextTasks`.
11
+ *
12
+ * One rule governs where this may be used: **scope decides what the board
13
+ * offers you, never what is reachable.** It filters recommendations and
14
+ * listings; it never hides a document you asked for by id, and it never hides
15
+ * work you have already picked up. Anything else and a dependency would point
16
+ * at something that, as far as you could tell, did not exist.
17
+ *
18
+ * It is routing, not access control. The board is a folder of markdown that the
19
+ * person holding the profile can read; this decides what gets handed to them,
20
+ * not what they are permitted to see.
21
+ */
22
+ export interface ResolvedScope {
23
+ /** Issues everything must sit at or below. `null` when unrestricted. */
24
+ under: Issue[] | null;
25
+ /** Issues nothing may sit at or below. Empty when nothing is excluded. */
26
+ exclude: Issue[];
27
+ /** Issue types allowed, or `null` when unrestricted. */
28
+ types: string[] | null;
29
+ /** Period ids allowed, child periods included, or `null` when unrestricted. */
30
+ periods: Set<string> | null;
31
+ /** Names in the profile this board has nothing for. Reported, never fatal. */
32
+ unknown: string[];
33
+ /** False when nothing is declared, so every issue is in scope. */
34
+ active: boolean;
35
+ }
36
+ /** A scope that excludes nothing — what every caller without a profile gets. */
37
+ export declare function fullScope(): ResolvedScope;
38
+ /**
39
+ * What a profile's scope means on this board.
40
+ *
41
+ * A name that resolves to nothing is dropped and reported rather than throwing:
42
+ * one profile may well be pointed at a board that has moved on, and a developer
43
+ * whose CLI refuses to run because an epic was renamed is worse served than one
44
+ * who is told about it. What it does *not* do is quietly widen the scope — a
45
+ * declared list that resolves to nothing matches nothing, so a stale `under`
46
+ * fails closed and says so.
47
+ */
48
+ export declare function resolveScope(board: LoadedBoard, scope: ProfileScope): ResolvedScope;
49
+ export declare function inScope(scope: ResolvedScope, issue: Issue): boolean;
50
+ /** The issues a scope leaves, in board order. */
51
+ export declare function scopedIssues(board: LoadedBoard, scope: ResolvedScope): Issue[];
52
+ /** One line saying what is being applied, for the CLI and for an agent to read. */
53
+ export declare function describeScope(scope: ResolvedScope): string;
54
+ /**
55
+ * A squad's member resource ids, resolved against the current roster.
56
+ *
57
+ * A member id the board no longer has is dropped and reported rather than
58
+ * throwing — a squad that named someone who has since left the roster is a fact
59
+ * the board should know, not a reason to stop loading. An empty squad matches
60
+ * nothing, never everything: the "stale scope fails closed" rule.
61
+ */
62
+ export interface ResolvedSquad {
63
+ /** Resource ids that are on the roster. */
64
+ members: string[];
65
+ /** Member ids the board has nothing for. Reported, never fatal. */
66
+ unknown: string[];
67
+ /** False when the squad has no members, so nothing is matched. */
68
+ active: boolean;
69
+ }
70
+ /** A squad that has nothing to match — what every call falling through gets. */
71
+ export declare function emptySquad(): ResolvedSquad;
72
+ /**
73
+ * Resolve a squad to its current member resource ids.
74
+ *
75
+ * Follows the same "resolve once, ask many times" pattern as `resolveScope`:
76
+ * the result can be cached and reused for every issue in a period. A stale
77
+ * member id is dropped and reported in `unknown` — the "stale scope fails
78
+ * closed" rule — so a squad whose every member has left the roster matches
79
+ * nothing rather than everything.
80
+ */
81
+ export declare function resolveSquad(board: LoadedBoard, squadId: string): ResolvedSquad;
@@ -0,0 +1,134 @@
1
+ import path from 'node:path';
2
+ import { isEmptyScope } from '../model/profile.js';
3
+ import { findIssue, findPeriod, subtreeOf } from './query.js';
4
+ /** A scope that excludes nothing — what every caller without a profile gets. */
5
+ export function fullScope() {
6
+ return { under: null, exclude: [], types: null, periods: null, unknown: [], active: false };
7
+ }
8
+ function isAtOrBelow(issue, root) {
9
+ return issue.dir === root.dir || issue.dir.startsWith(root.dir + path.sep);
10
+ }
11
+ function resolveIssues(board, ids, unknown) {
12
+ const issues = [];
13
+ for (const id of ids) {
14
+ const issue = findIssue(board, id);
15
+ if (issue)
16
+ issues.push(issue);
17
+ else
18
+ unknown.push(id);
19
+ }
20
+ return issues;
21
+ }
22
+ /**
23
+ * A period holds work scheduled in it *and* in the periods below it, the same
24
+ * way `issuesInPeriod` does — naming an increment must not mean "the sprints
25
+ * inside it do not count".
26
+ */
27
+ function resolvePeriods(board, ids, unknown) {
28
+ const allowed = new Set();
29
+ for (const id of ids) {
30
+ const period = findPeriod(board, id);
31
+ if (!period) {
32
+ unknown.push(id);
33
+ continue;
34
+ }
35
+ for (const node of subtreeOf(board.periods, period))
36
+ allowed.add(node.id);
37
+ }
38
+ return allowed;
39
+ }
40
+ function resolveTypes(board, names, unknown) {
41
+ const types = [];
42
+ for (const name of names) {
43
+ if (board.config.issue_types[name])
44
+ types.push(name);
45
+ else
46
+ unknown.push(name);
47
+ }
48
+ return types;
49
+ }
50
+ /**
51
+ * What a profile's scope means on this board.
52
+ *
53
+ * A name that resolves to nothing is dropped and reported rather than throwing:
54
+ * one profile may well be pointed at a board that has moved on, and a developer
55
+ * whose CLI refuses to run because an epic was renamed is worse served than one
56
+ * who is told about it. What it does *not* do is quietly widen the scope — a
57
+ * declared list that resolves to nothing matches nothing, so a stale `under`
58
+ * fails closed and says so.
59
+ */
60
+ export function resolveScope(board, scope) {
61
+ if (isEmptyScope(scope))
62
+ return fullScope();
63
+ const unknown = [];
64
+ return {
65
+ under: scope.under ? resolveIssues(board, scope.under, unknown) : null,
66
+ exclude: scope.exclude ? resolveIssues(board, scope.exclude, unknown) : [],
67
+ types: scope.types ? resolveTypes(board, scope.types, unknown) : null,
68
+ periods: scope.periods ? resolvePeriods(board, scope.periods, unknown) : null,
69
+ unknown,
70
+ active: true,
71
+ };
72
+ }
73
+ export function inScope(scope, issue) {
74
+ if (!scope.active)
75
+ return true;
76
+ if (scope.exclude.some((root) => isAtOrBelow(issue, root)))
77
+ return false;
78
+ if (scope.under && !scope.under.some((root) => isAtOrBelow(issue, root)))
79
+ return false;
80
+ if (scope.types && !scope.types.includes(issue.type))
81
+ return false;
82
+ if (scope.periods && !(issue.period && scope.periods.has(issue.period)))
83
+ return false;
84
+ return true;
85
+ }
86
+ /** The issues a scope leaves, in board order. */
87
+ export function scopedIssues(board, scope) {
88
+ return scope.active ? board.issues.filter((issue) => inScope(scope, issue)) : board.issues;
89
+ }
90
+ /** One line saying what is being applied, for the CLI and for an agent to read. */
91
+ export function describeScope(scope) {
92
+ if (!scope.active)
93
+ return 'the whole board';
94
+ const parts = [];
95
+ if (scope.under)
96
+ parts.push(`under ${scope.under.map((issue) => issue.id).join(', ') || 'nothing'}`);
97
+ if (scope.exclude.length)
98
+ parts.push(`not ${scope.exclude.map((issue) => issue.id).join(', ')}`);
99
+ if (scope.types)
100
+ parts.push(scope.types.join('/') || 'no type');
101
+ if (scope.periods)
102
+ parts.push(`in ${[...scope.periods].join(', ') || 'no period'}`);
103
+ return parts.join(' · ');
104
+ }
105
+ /** A squad that has nothing to match — what every call falling through gets. */
106
+ export function emptySquad() {
107
+ return { members: [], unknown: [], active: false };
108
+ }
109
+ /**
110
+ * Resolve a squad to its current member resource ids.
111
+ *
112
+ * Follows the same "resolve once, ask many times" pattern as `resolveScope`:
113
+ * the result can be cached and reused for every issue in a period. A stale
114
+ * member id is dropped and reported in `unknown` — the "stale scope fails
115
+ * closed" rule — so a squad whose every member has left the roster matches
116
+ * nothing rather than everything.
117
+ */
118
+ export function resolveSquad(board, squadId) {
119
+ const squad = board.squadsById.get(squadId);
120
+ if (!squad)
121
+ return emptySquad();
122
+ const members = [];
123
+ const unknown = [];
124
+ for (const id of squad.members) {
125
+ if (board.resourcesById.has(id)) {
126
+ members.push(id);
127
+ }
128
+ else {
129
+ unknown.push(id);
130
+ }
131
+ }
132
+ return { members, unknown, active: members.length > 0 };
133
+ }
134
+ //# sourceMappingURL=scope.js.map