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,145 @@
1
+ /**
2
+ * The degradation ladder as a report (LP-275): for every board construct a
3
+ * remote must carry, which rung of the ladder it lands on and why the rung
4
+ * above was not available.
5
+ *
6
+ * The ladder (LP-255) is the ordered set of carriers a field may use, best
7
+ * first:
8
+ *
9
+ * 1. native the remote has a real place for it
10
+ * 2. custom field the remote can be *given* one (the push creates it)
11
+ * 3. label a low-fidelity native carrier for enums and types
12
+ * 4. managed block a delimited region in the issue body
13
+ * 5. comment the same block as a comment, when the body is not writable
14
+ * 6. refuse a `required` field with none of the above — the sync stops
15
+ *
16
+ * `preflight.ts` collects the *values* one remote cannot carry, per document,
17
+ * offline, as a `Problem[]`. This module is the other half: the *constructs*
18
+ * (hierarchy, type, status, each edge, each attribute, each period level) and
19
+ * their rungs, read from the **resolved** capabilities — probes answered —
20
+ * which is what `preflight.ts` cannot do offline. The two are complementary:
21
+ * the value problems gate the push, the rungs are the report a person reads
22
+ * before deciding whether to fix the tracker or accept the encoding. Nothing
23
+ * prints these rows yet — the module has no caller outside the barrel export.
24
+ *
25
+ * A construct is refused (rung 6) when it is `required` and rungs 1-5 are all
26
+ * unavailable. Only attributes carry `required`, so the bottom rung is theirs.
27
+ * The same attribute without `required` is `dropped` instead — a warning, not
28
+ * a stop. `refusalProblems` turns those two outcomes into the `Problem[]` a
29
+ * sync gates on: a `refused` row is an error (a warning under `--force`), a
30
+ * `dropped` row a warning, and both name the field, the missing capability and
31
+ * (for a refusal) the config change that resolves it (LP-279).
32
+ * The push is named whenever a carrier can be created through the
33
+ * provider's API (`provisioning.customFields` / `provisioning.periods`).
34
+ *
35
+ * Constructs the ladder does not cover, deliberately: `comments` and
36
+ * `incrementalRead` are sync *mechanics*, not fields, and the assignee
37
+ * (`accounts.ts`) has no capability cell of its own — a generic pool's label
38
+ * degradation is LP-271's, not the ladder's. Attributes are never reported
39
+ * `native`: the capability table declares no native attribute fields, and the
40
+ * providers implemented so far have none (GitHub); a provider with native
41
+ * fields (Jira) will add a cell before that rung lights up.
42
+ *
43
+ * Pure: no disk, no network. The board, the opened remote and the resolved
44
+ * capability table are passed in, so a dry-run is this exact code path.
45
+ */
46
+ import type { LoadedBoard } from '../core/board/load.js';
47
+ import type { Problem } from '../core/model/types.js';
48
+ import type { ResolvedCapabilities } from './capabilities.js';
49
+ import type { OpenedRemote } from './remotes.js';
50
+ /**
51
+ * One rung of the degradation ladder, best first — plus `dropped`, the outcome
52
+ * off the bottom of the ladder: a field with no carrier that is *not*
53
+ * `required`, so it is lost with a warning rather than refused.
54
+ */
55
+ export type Rung = 'native' | 'custom_field' | 'label' | 'managed_block' | 'comment' | 'refused' | 'dropped';
56
+ /** A carrier that does not exist on the remote yet, and is created for you. */
57
+ export interface ProvisionHint {
58
+ /** The command that creates it — the push, which does this before it files. */
59
+ command: string;
60
+ /** What that command would create. */
61
+ description: string;
62
+ }
63
+ /** One construct and where it landed. */
64
+ export interface LadderRow {
65
+ /** The construct: `hierarchy`, `type`, `status`, an edge, an attribute, a period type. */
66
+ construct: string;
67
+ /** The board side, human-readable — the chain, the statuses, the mapped carrier. */
68
+ board: string;
69
+ /** The rung the field landed on. */
70
+ rung: Rung;
71
+ /** Why the rung above was not available. */
72
+ reason: string;
73
+ /** Present when the carrier can be created through the API. */
74
+ provision?: ProvisionHint;
75
+ }
76
+ /** Options for `preflightLadder`. */
77
+ export interface LadderOptions {
78
+ /**
79
+ * Whether the remote body can carry a managed block (rung 4). Defaults to
80
+ * true. `encoding: comment` on the remote is the declared spelling of
81
+ * `false` — derive it with `bodyWritableFor(remote)`.
82
+ */
83
+ bodyWritable?: boolean;
84
+ }
85
+ /** The report this module renders, for whatever comes to print it. */
86
+ export interface PreflightReport {
87
+ remoteName: string;
88
+ /** Provider name and its coordinates: `github: acme/payments`. */
89
+ connection: string;
90
+ rows: LadderRow[];
91
+ /** Every row landed on rung 1. */
92
+ lossless: boolean;
93
+ /** Some `required` construct reached rung 6 — the sync must stop. */
94
+ refused: boolean;
95
+ }
96
+ /**
97
+ * True when a remote's `encoding` keeps degraded fields in the body (rung 4).
98
+ * `encoding: comment` is the declared spelling of "the body is not writable"
99
+ * and pushes degraded fields down to the managed comment (rung 5) instead.
100
+ */
101
+ export declare function bodyWritableFor(remote: OpenedRemote): boolean;
102
+ /**
103
+ * Compute the rung every board construct lands on, against one remote's
104
+ * resolved capabilities.
105
+ *
106
+ * The remote must already have been opened (`openRemote`), so `remote.mapping`
107
+ * carries the provider-validated shape; the capabilities must already have
108
+ * been resolved (`resolveCapabilities`), so probes are answered. Both are
109
+ * handed in rather than derived here — this function stays pure and a
110
+ * dry-run is the exact code path a real check runs.
111
+ */
112
+ export declare function preflightLadder(board: LoadedBoard, remote: OpenedRemote, capabilities: ResolvedCapabilities, options?: LadderOptions): PreflightReport;
113
+ /**
114
+ * Render the report as text. Lossless boards get the short form — a single
115
+ * line saying nothing is degraded (the story's third criterion). Otherwise one
116
+ * row per construct: name, board side, rung, and the reason the rung above was
117
+ * not available, naming the command that creates a carrier where one can be.
118
+ */
119
+ export declare function renderLadderReport(report: PreflightReport): string;
120
+ /** Options for `refusalProblems`. */
121
+ export interface RefusalOptions {
122
+ /**
123
+ * When true, a `refused` field is a warning rather than an error — the
124
+ * `--force` escape hatch, which lets the sync proceed once while the caller
125
+ * lists the dropped fields in its summary and audit log.
126
+ */
127
+ force?: boolean;
128
+ /** The config file path each problem is reported against. Defaults to `.lpm/config.yml`. */
129
+ configPath?: string;
130
+ }
131
+ /**
132
+ * The problems a ladder report raises for the sync gate (LP-279): the bottom
133
+ * of the ladder, where a field has nowhere to go, must never be silent loss.
134
+ *
135
+ * A `refused` row — a `required` attribute with no carrier at all — is an
136
+ * error that stops the sync, unless `force` downgrades it to a warning. A
137
+ * `dropped` row — the same attribute without `required` — is always a warning
138
+ * and the sync proceeds. Both name the field, the capability the remote lacks,
139
+ * and (for a refusal) the concrete config change that resolves it: mapping the
140
+ * attribute to a label, the one carrier every provider has.
141
+ *
142
+ * Pure: it reads the report already computed by `preflightLadder` against
143
+ * resolved capabilities, so a dry-run and a real sync run the exact same code.
144
+ */
145
+ export declare function refusalProblems(report: PreflightReport, options?: RefusalOptions): Problem[];
@@ -0,0 +1,387 @@
1
+ /**
2
+ * The degradation ladder as a report (LP-275): for every board construct a
3
+ * remote must carry, which rung of the ladder it lands on and why the rung
4
+ * above was not available.
5
+ *
6
+ * The ladder (LP-255) is the ordered set of carriers a field may use, best
7
+ * first:
8
+ *
9
+ * 1. native the remote has a real place for it
10
+ * 2. custom field the remote can be *given* one (the push creates it)
11
+ * 3. label a low-fidelity native carrier for enums and types
12
+ * 4. managed block a delimited region in the issue body
13
+ * 5. comment the same block as a comment, when the body is not writable
14
+ * 6. refuse a `required` field with none of the above — the sync stops
15
+ *
16
+ * `preflight.ts` collects the *values* one remote cannot carry, per document,
17
+ * offline, as a `Problem[]`. This module is the other half: the *constructs*
18
+ * (hierarchy, type, status, each edge, each attribute, each period level) and
19
+ * their rungs, read from the **resolved** capabilities — probes answered —
20
+ * which is what `preflight.ts` cannot do offline. The two are complementary:
21
+ * the value problems gate the push, the rungs are the report a person reads
22
+ * before deciding whether to fix the tracker or accept the encoding. Nothing
23
+ * prints these rows yet — the module has no caller outside the barrel export.
24
+ *
25
+ * A construct is refused (rung 6) when it is `required` and rungs 1-5 are all
26
+ * unavailable. Only attributes carry `required`, so the bottom rung is theirs.
27
+ * The same attribute without `required` is `dropped` instead — a warning, not
28
+ * a stop. `refusalProblems` turns those two outcomes into the `Problem[]` a
29
+ * sync gates on: a `refused` row is an error (a warning under `--force`), a
30
+ * `dropped` row a warning, and both name the field, the missing capability and
31
+ * (for a refusal) the config change that resolves it (LP-279).
32
+ * The push is named whenever a carrier can be created through the
33
+ * provider's API (`provisioning.customFields` / `provisioning.periods`).
34
+ *
35
+ * Constructs the ladder does not cover, deliberately: `comments` and
36
+ * `incrementalRead` are sync *mechanics*, not fields, and the assignee
37
+ * (`accounts.ts`) has no capability cell of its own — a generic pool's label
38
+ * degradation is LP-271's, not the ladder's. Attributes are never reported
39
+ * `native`: the capability table declares no native attribute fields, and the
40
+ * providers implemented so far have none (GitHub); a provider with native
41
+ * fields (Jira) will add a cell before that rung lights up.
42
+ *
43
+ * Pure: no disk, no network. The board, the opened remote and the resolved
44
+ * capability table are passed in, so a dry-run is this exact code path.
45
+ */
46
+ import { hierarchyFor } from '../core/config/lookup.js';
47
+ import { hasPeriods } from '../core/model/types.js';
48
+ import { attributeDefsOf } from './preflight.js';
49
+ import { normalizePeriodMapping } from './periods.js';
50
+ /** The rung's display name. */
51
+ const RUNG_LABEL = {
52
+ native: 'native',
53
+ custom_field: 'custom field',
54
+ label: 'label',
55
+ managed_block: 'managed block',
56
+ comment: 'comment',
57
+ refused: 'refused',
58
+ dropped: 'dropped',
59
+ };
60
+ // ---------------------------------------------------------------------------
61
+ // Helpers
62
+ // ---------------------------------------------------------------------------
63
+ /**
64
+ * True when a remote's `encoding` keeps degraded fields in the body (rung 4).
65
+ * `encoding: comment` is the declared spelling of "the body is not writable"
66
+ * and pushes degraded fields down to the managed comment (rung 5) instead.
67
+ */
68
+ export function bodyWritableFor(remote) {
69
+ return remote.encoding !== 'comment';
70
+ }
71
+ function asRecord(value) {
72
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
73
+ return value;
74
+ }
75
+ return {};
76
+ }
77
+ /** A phrase naming the remote's native nesting, for hierarchy reasons. */
78
+ function depthPhrase(hierarchyDepth) {
79
+ if (hierarchyDepth === 0)
80
+ return 'the remote is flat';
81
+ if (hierarchyDepth === 1)
82
+ return 'one native sub-issue level';
83
+ return `${hierarchyDepth} native sub-issue levels`;
84
+ }
85
+ /** The hint for a carrier the push creates, when the provider can create fields. */
86
+ function customFieldHint(capabilities) {
87
+ if (!capabilities.provisioning.customFields)
88
+ return undefined;
89
+ return {
90
+ command: 'lpm remote push',
91
+ description: 'creates the missing fields and options before it files',
92
+ };
93
+ }
94
+ // ---------------------------------------------------------------------------
95
+ // Per-construct decisions
96
+ // ---------------------------------------------------------------------------
97
+ /** The issue hierarchy chain, for the `board` column. */
98
+ function issueChain(board) {
99
+ return hierarchyFor(board.config, 'issue')
100
+ .map((level) => level.join('/'))
101
+ .join(' > ');
102
+ }
103
+ /**
104
+ * Nesting: native while the board is no deeper than the remote's native depth
105
+ * (`hierarchyDepth` parent edges + the root); the extra levels' parent rides
106
+ * the managed block. The types at those levels are the `type` row's business.
107
+ */
108
+ function hierarchyRow(board, capabilities) {
109
+ const hierarchy = hierarchyFor(board.config, 'issue');
110
+ const chain = issueChain(board);
111
+ const nativeDepth = capabilities.hierarchyDepth + 1;
112
+ if (hierarchy.length <= nativeDepth) {
113
+ return {
114
+ construct: 'hierarchy',
115
+ board: chain,
116
+ rung: 'native',
117
+ reason: 'fits within the remote native depth',
118
+ };
119
+ }
120
+ return {
121
+ construct: 'hierarchy',
122
+ board: chain,
123
+ rung: 'managed_block',
124
+ reason: `${depthPhrase(capabilities.hierarchyDepth)}; deeper nesting is carried in the managed block`,
125
+ };
126
+ }
127
+ /** Issue type: native where the provider has one, else a label. */
128
+ function typeRow(board, capabilities) {
129
+ const types = hierarchyFor(board.config, 'issue').flat().join(' ');
130
+ return capabilities.nativeTypes
131
+ ? { construct: 'type', board: types, rung: 'native', reason: 'the remote has native issue types' }
132
+ : { construct: 'type', board: types, rung: 'label', reason: 'no native issue type' };
133
+ }
134
+ /** Status: named workflow states are native; open/closed degrades to a field or labels. */
135
+ function statusRow(board, capabilities) {
136
+ const statuses = board.config.statuses.map((status) => status.id).join(' ');
137
+ if (capabilities.status.kind !== 'binary') {
138
+ return { construct: 'status', board: statuses, rung: 'native', reason: 'native workflow states' };
139
+ }
140
+ const base = { construct: 'status', board: statuses };
141
+ if (capabilities.customFields !== null) {
142
+ return {
143
+ ...base,
144
+ rung: 'custom_field',
145
+ reason: 'only open/closed natively; richer states ride a custom field',
146
+ provision: customFieldHint(capabilities),
147
+ };
148
+ }
149
+ return {
150
+ ...base,
151
+ rung: 'label',
152
+ reason: 'only open/closed natively, and no custom fields — labels carry the state',
153
+ };
154
+ }
155
+ /** A dependency edge: native where the remote holds one, else the managed block. */
156
+ function edgeRow(kind, native) {
157
+ if (native) {
158
+ return {
159
+ construct: kind,
160
+ board: '',
161
+ rung: 'native',
162
+ reason: kind === 'depends_on' ? 'native blocking edge' : 'native relates edge',
163
+ };
164
+ }
165
+ return {
166
+ construct: kind,
167
+ board: '',
168
+ rung: 'managed_block',
169
+ reason: kind === 'depends_on'
170
+ ? 'the remote has no blocking edge'
171
+ : 'the remote has no relates edge',
172
+ };
173
+ }
174
+ /** One declared issue attribute, walked down the ladder. */
175
+ function attributeRow(name, def, mappedTo, capabilities, bodyWritable) {
176
+ const mapped = mappedTo !== undefined && mappedTo !== '';
177
+ const board = mapped ? `-> "${mappedTo}"` : '';
178
+ // Rung 3: a mapped attribute rides the mapping's carrier, which for the
179
+ // implemented provider (GitHub) is a label prefix. Rung 1 never lights up —
180
+ // no capability cell declares native attribute fields. Rung 2 is skipped
181
+ // because the mapping pinned the carrier to a label.
182
+ if (mapped) {
183
+ return {
184
+ construct: name,
185
+ board,
186
+ rung: 'label',
187
+ reason: 'no native field; the mapping carries attributes as labels',
188
+ };
189
+ }
190
+ // Rung 2: an unmapped attribute can be given a custom field, when the
191
+ // provider holds them.
192
+ if (capabilities.customFields !== null) {
193
+ return {
194
+ construct: name,
195
+ board,
196
+ rung: 'custom_field',
197
+ reason: 'not mapped; carried as a custom field',
198
+ provision: customFieldHint(capabilities),
199
+ };
200
+ }
201
+ // Rungs 4-6: the managed block, its comment fallback, or the stop.
202
+ if (bodyWritable) {
203
+ return {
204
+ construct: name,
205
+ board,
206
+ rung: 'managed_block',
207
+ reason: 'not mapped and no custom fields — carried in the managed block',
208
+ };
209
+ }
210
+ if (capabilities.comments.native) {
211
+ return {
212
+ construct: name,
213
+ board,
214
+ rung: 'comment',
215
+ reason: 'not mapped, and the body is not writable — carried as a managed comment',
216
+ };
217
+ }
218
+ // Rung 6: a `required` field with none of the above is refused — the sync
219
+ // stops rather than dropping it in silence. The same field, not required,
220
+ // is dropped with a warning instead (the `dropped` outcome off the ladder).
221
+ if (def.required === true) {
222
+ return {
223
+ construct: name,
224
+ board,
225
+ rung: 'refused',
226
+ reason: 'required, and no carrier is available (no custom fields, no writable body, no comments)',
227
+ };
228
+ }
229
+ return {
230
+ construct: name,
231
+ board,
232
+ rung: 'dropped',
233
+ reason: 'not required, and no carrier is available (no custom fields, no writable body, no comments)',
234
+ };
235
+ }
236
+ /** One declared period type: the container level vs the degraded levels. */
237
+ function periodContainerRow(type, capabilities, carrier) {
238
+ if (capabilities.periods.native || capabilities.periods.creatable) {
239
+ const provision = capabilities.periods.native
240
+ ? undefined
241
+ : { command: 'lpm remote push', description: 'creates the period container before it files' };
242
+ return {
243
+ construct: type,
244
+ board: `-> ${carrier}`,
245
+ rung: 'native',
246
+ reason: 'native period container (milestone, sprint, cycle)',
247
+ ...(provision ? { provision } : {}),
248
+ };
249
+ }
250
+ return {
251
+ construct: type,
252
+ board: '',
253
+ rung: 'managed_block',
254
+ reason: 'no native container — carried in the managed block',
255
+ };
256
+ }
257
+ // ---------------------------------------------------------------------------
258
+ // The report
259
+ // ---------------------------------------------------------------------------
260
+ /**
261
+ * Compute the rung every board construct lands on, against one remote's
262
+ * resolved capabilities.
263
+ *
264
+ * The remote must already have been opened (`openRemote`), so `remote.mapping`
265
+ * carries the provider-validated shape; the capabilities must already have
266
+ * been resolved (`resolveCapabilities`), so probes are answered. Both are
267
+ * handed in rather than derived here — this function stays pure and a
268
+ * dry-run is the exact code path a real check runs.
269
+ */
270
+ export function preflightLadder(board, remote, capabilities, options = {}) {
271
+ // `encoding: comment` is the declared spelling of "the body is not
272
+ // writable"; the option overrides it for a caller that probed a runtime
273
+ // fact instead (a body write the remote refused).
274
+ const bodyWritable = options.bodyWritable ?? bodyWritableFor(remote);
275
+ const rows = [
276
+ hierarchyRow(board, capabilities),
277
+ typeRow(board, capabilities),
278
+ statusRow(board, capabilities),
279
+ edgeRow('depends_on', capabilities.edges.dependsOn),
280
+ edgeRow('relates_to', capabilities.edges.relatesTo),
281
+ ];
282
+ const defs = attributeDefsOf(board);
283
+ const attributeMapping = asRecord(remote.mapping['attributes']);
284
+ for (const name of Object.keys(defs).sort()) {
285
+ const mappedTo = attributeMapping[name];
286
+ rows.push(attributeRow(name, defs[name], typeof mappedTo === 'string' ? mappedTo : undefined, capabilities, bodyWritable));
287
+ }
288
+ if (hasPeriods(board.config)) {
289
+ const periodMapping = normalizePeriodMapping(remote.mapping['periods']);
290
+ for (const type of board.config.period_hierarchy.flat()) {
291
+ if (periodMapping && type === periodMapping.container) {
292
+ rows.push(periodContainerRow(type, capabilities, periodMapping.carrier));
293
+ }
294
+ else {
295
+ rows.push({
296
+ construct: type,
297
+ board: '',
298
+ rung: 'managed_block',
299
+ reason: 'not the container level — carried as a `period:<type>` row in the managed block',
300
+ });
301
+ }
302
+ }
303
+ }
304
+ const providerName = board.config.remotes[remote.name]?.provider ?? '';
305
+ const repo = remote.connection['repo'];
306
+ const connection = typeof repo === 'string' && repo !== ''
307
+ ? providerName !== ''
308
+ ? `${providerName}: ${repo}`
309
+ : repo
310
+ : providerName;
311
+ return {
312
+ remoteName: remote.name,
313
+ connection,
314
+ rows,
315
+ lossless: rows.every((row) => row.rung === 'native'),
316
+ refused: rows.some((row) => row.rung === 'refused'),
317
+ };
318
+ }
319
+ // ---------------------------------------------------------------------------
320
+ // The text form
321
+ // ---------------------------------------------------------------------------
322
+ function pad(text, width) {
323
+ return text.length >= width ? `${text} ` : text + ' '.repeat(width - text.length);
324
+ }
325
+ /**
326
+ * Render the report as text. Lossless boards get the short form — a single
327
+ * line saying nothing is degraded (the story's third criterion). Otherwise one
328
+ * row per construct: name, board side, rung, and the reason the rung above was
329
+ * not available, naming the command that creates a carrier where one can be.
330
+ */
331
+ export function renderLadderReport(report) {
332
+ const header = `Remote "${report.remoteName}" (${report.connection})`;
333
+ if (report.lossless) {
334
+ return `${header} — every field round-trips losslessly.\n`;
335
+ }
336
+ const constructWidth = Math.max(...report.rows.map((row) => row.construct.length));
337
+ const boardWidth = Math.max(0, ...report.rows.map((row) => row.board.length));
338
+ const rungWidth = Math.max(...report.rows.map((row) => RUNG_LABEL[row.rung].length));
339
+ const lines = [header, ''];
340
+ for (const row of report.rows) {
341
+ const provision = row.provision
342
+ ? ` — ${row.provision.command} (${row.provision.description})`
343
+ : '';
344
+ lines.push(` ${pad(row.construct, constructWidth)} ${pad(row.board, boardWidth)} ${pad(RUNG_LABEL[row.rung], rungWidth)} ${row.reason}${provision}`);
345
+ }
346
+ return `${lines.join('\n')}\n`;
347
+ }
348
+ /**
349
+ * The problems a ladder report raises for the sync gate (LP-279): the bottom
350
+ * of the ladder, where a field has nowhere to go, must never be silent loss.
351
+ *
352
+ * A `refused` row — a `required` attribute with no carrier at all — is an
353
+ * error that stops the sync, unless `force` downgrades it to a warning. A
354
+ * `dropped` row — the same attribute without `required` — is always a warning
355
+ * and the sync proceeds. Both name the field, the capability the remote lacks,
356
+ * and (for a refusal) the concrete config change that resolves it: mapping the
357
+ * attribute to a label, the one carrier every provider has.
358
+ *
359
+ * Pure: it reads the report already computed by `preflightLadder` against
360
+ * resolved capabilities, so a dry-run and a real sync run the exact same code.
361
+ */
362
+ export function refusalProblems(report, options = {}) {
363
+ const force = options.force ?? false;
364
+ const path = options.configPath ?? '.lpm/config.yml';
365
+ const problems = [];
366
+ for (const row of report.rows) {
367
+ if (row.rung !== 'refused' && row.rung !== 'dropped')
368
+ continue;
369
+ const key = `remotes.${report.remoteName}.mapping.attributes.${row.construct}`;
370
+ if (row.rung === 'refused') {
371
+ problems.push({
372
+ level: force ? 'warn' : 'error',
373
+ path,
374
+ message: `${key}: attribute "${row.construct}" is ${row.reason} — map it to a label so the value is carried: ${key}: "<label>"`,
375
+ });
376
+ }
377
+ else {
378
+ problems.push({
379
+ level: 'warn',
380
+ path,
381
+ message: `${key}: attribute "${row.construct}" is ${row.reason} — the value will be dropped`,
382
+ });
383
+ }
384
+ }
385
+ return problems;
386
+ }
387
+ //# sourceMappingURL=ladder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ladder.js","sourceRoot":"","sources":["../../src/remote/ladder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * The ledger — which remote owns which document, across every declared remote.
3
+ *
4
+ * A board may declare several remotes, and each keeps its own correspondence
5
+ * store (`.lpm/remotes/<name>/links.json`). Read one at a time they answer "is
6
+ * LP-12 on *this* tracker?"; nothing answered the question a person actually
7
+ * asks, which is **"where does LP-12 live?"** — and nothing stopped the same
8
+ * document being filed onto two trackers at once. Two twins of one story is not
9
+ * a mirror of a plan: a status moves on one side, the other keeps its own, and
10
+ * the next sync of each writes a different truth back onto the same document.
11
+ *
12
+ * So: **one document, one remote, at a time.** This module is the whole of that
13
+ * rule. It is deliberately a *derived* index rather than a file of its own —
14
+ * built by reading the stores that already exist, in the same spirit as the
15
+ * dependency inverses the engine derives at load. A committed `ledger.json`
16
+ * would be a second copy of a fact the link stores already hold, free to
17
+ * disagree with them after a merge, and needing its own repair pass to say
18
+ * which copy was right. There is nothing to repair here: the stores *are* the
19
+ * ledger.
20
+ *
21
+ * Where it is enforced, and what happens:
22
+ *
23
+ * - `lpm remote push` — a document another remote owns is never created a
24
+ * second time. It is reported in the plan's `skipped` list with the reason
25
+ * `owned_elsewhere` and the key it already has, exactly as a decoupled
26
+ * document is reported, so a whole-board push to a second remote is a
27
+ * readable report rather than a refusal or a duplicate.
28
+ * - `lpm remote link` — adopting a twin for a document that already has one
29
+ * elsewhere is refused outright, because it is one explicit document and
30
+ * the person is asking for the thing the rule forbids.
31
+ *
32
+ * Nothing here writes. The remedy — `lpm remote decouple <id>` on the remote
33
+ * that holds it — is the operator's, and is named in every message.
34
+ */
35
+ import type { BoardConfig } from '../core/model/types.js';
36
+ import type { BoardPaths } from '../core/storage/paths.js';
37
+ /** Where one document is filed: the remote that holds it, and the twin's key. */
38
+ export interface LedgerEntry {
39
+ /** The local document id. */
40
+ localId: string;
41
+ /** The declared remote's name (`jira`, `upstream`). */
42
+ remote: string;
43
+ /** That remote's provider (`jira`, `github`, `linear`, `jsonfile`). */
44
+ provider: string;
45
+ /** The remote system's opaque id. */
46
+ remoteId: string;
47
+ /** The human-readable key, e.g. `acme/payments#418` or `PAY-31`. */
48
+ remoteKey: string;
49
+ /** Full URL to the twin, when the store recorded one. */
50
+ remoteUrl: string;
51
+ /** When the link was last written (ISO-8601). */
52
+ syncedAt: string;
53
+ }
54
+ /** Every document that has a twin, keyed by local id. */
55
+ export interface Ledger {
56
+ /** Local id → where it is filed. */
57
+ byLocalId: ReadonlyMap<string, LedgerEntry>;
58
+ /** Remote name → the documents that remote holds, in id order. */
59
+ byRemote: ReadonlyMap<string, readonly LedgerEntry[]>;
60
+ }
61
+ /**
62
+ * Build the ledger by reading every declared remote's link store.
63
+ *
64
+ * A remote whose store does not exist yet contributes nothing (the first sync
65
+ * creates it). A document that somehow appears in two stores — a hand-edited
66
+ * file, a merge that took both sides — is reported by `conflicts()` rather than
67
+ * silently resolved: this is a read, and picking a winner is not its call.
68
+ */
69
+ export declare function buildLedger(paths: BoardPaths, config: BoardConfig): Ledger;
70
+ /** Where one document is filed, or `undefined` when it has no twin anywhere. */
71
+ export declare function ownerOf(ledger: Ledger, localId: string): LedgerEntry | undefined;
72
+ /**
73
+ * The remote a document is filed on, when that is not `remoteName` — the one
74
+ * question every enforcement point asks. `undefined` means the document is free
75
+ * (no twin at all) or already belongs to this remote.
76
+ */
77
+ export declare function otherOwner(ledger: Ledger, localId: string, remoteName: string): LedgerEntry | undefined;
78
+ /**
79
+ * Every document filed somewhere other than `remoteName`. The push planner
80
+ * takes this as the set it must not create a second twin for.
81
+ */
82
+ export declare function idsOwnedElsewhere(ledger: Ledger, remoteName: string): Map<string, LedgerEntry>;
83
+ /**
84
+ * Documents that appear in more than one remote's store — the state this rule
85
+ * exists to prevent, arrived at by a hand edit or a merge that took both sides.
86
+ * Reported by `lpm remote ledger`, never repaired here.
87
+ */
88
+ export declare function conflicts(paths: BoardPaths, config: BoardConfig): LedgerEntry[][];
89
+ /**
90
+ * Refuse an operation that would give `localId` a second twin.
91
+ *
92
+ * Used where the request names one document explicitly (`lpm remote link`): the
93
+ * person asked for exactly the thing the rule forbids, so the answer is an
94
+ * error naming the holder and the one command that releases it. A bulk push
95
+ * reports instead — see the module comment.
96
+ */
97
+ export declare function requireUnclaimed(ledger: Ledger, localId: string, remoteName: string): void;