@hiroleague/taskmanager 0.0.2 → 0.0.4

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 (179) hide show
  1. package/README.md +1 -1
  2. package/dist/assets/architecture-YZFGNWBL-DoE0KxgG.js +1 -0
  3. package/dist/assets/architectureDiagram-Q4EWVU46-DeuBhy7X.js +36 -0
  4. package/dist/assets/{blockDiagram-DXYQGD6D-DQzEOPT2.js → blockDiagram-DXYQGD6D-BDBy9ns9.js} +1 -1
  5. package/dist/assets/{c4Diagram-AHTNJAMY-B2Yfcwbo.js → c4Diagram-AHTNJAMY-CpqJj_8a.js} +1 -1
  6. package/dist/assets/channel-PHRyjspt.js +1 -0
  7. package/dist/assets/{chunk-2KRD3SAO-C2e-_49I.js → chunk-2KRD3SAO-DEpUsxdZ.js} +1 -1
  8. package/dist/assets/chunk-336JU56O-BGQvSwLk.js +2 -0
  9. package/dist/assets/chunk-426QAEUC-Cl9nQN9c.js +1 -0
  10. package/dist/assets/{chunk-4TB4RGXK-AZq3s1Dh.js → chunk-4TB4RGXK-Dq7aiIrZ.js} +2 -2
  11. package/dist/assets/{chunk-5FUZZQ4R-XEga0hMC.js → chunk-5FUZZQ4R-B_HuuUjf.js} +1 -1
  12. package/dist/assets/{chunk-5PVQY5BW-BrmXs2Gs.js → chunk-5PVQY5BW-cGfZCZGU.js} +2 -2
  13. package/dist/assets/{chunk-67CJDMHE-B1-M78qu.js → chunk-67CJDMHE-BMYAVZfw.js} +1 -1
  14. package/dist/assets/{chunk-7N4EOEYR-D7mYFpz-.js → chunk-7N4EOEYR-Ct-EY7Nc.js} +1 -1
  15. package/dist/assets/{chunk-AA7GKIK3-VWI9k39i.js → chunk-AA7GKIK3-Bd4HFpeo.js} +1 -1
  16. package/dist/assets/{chunk-CIAEETIT-hnu4zamm.js → chunk-CIAEETIT-CrFUkPMT.js} +1 -1
  17. package/dist/assets/{chunk-EDXVE4YY-DxUqDyxy.js → chunk-EDXVE4YY-DMDyt0NF.js} +1 -1
  18. package/dist/assets/{chunk-ENJZ2VHE-BgZKYo1l.js → chunk-ENJZ2VHE-DrWzOrpd.js} +1 -1
  19. package/dist/assets/{chunk-FOC6F5B3-BJsh9nO9.js → chunk-FOC6F5B3-Bemzq96j.js} +1 -1
  20. package/dist/assets/{chunk-ICPOFSXX-BNR1V8rT.js → chunk-ICPOFSXX-DkUVjrLw.js} +5 -5
  21. package/dist/assets/{chunk-K5T4RW27-BLIPdXaZ.js → chunk-K5T4RW27-ALKIf000.js} +5 -5
  22. package/dist/assets/{chunk-KGLVRYIC-DvaW2TkT.js → chunk-KGLVRYIC-Bg6HNTZ-.js} +1 -1
  23. package/dist/assets/{chunk-LIHQZDEY-CUsM0M11.js → chunk-LIHQZDEY-DeyGongE.js} +1 -1
  24. package/dist/assets/{chunk-ORNJ4GCN-CfluNV0_.js → chunk-ORNJ4GCN-Bx83s1bJ.js} +1 -1
  25. package/dist/assets/{chunk-OYMX7WX6-CkWzw4JX.js → chunk-OYMX7WX6-BqRUtRpL.js} +1 -1
  26. package/dist/assets/{chunk-U2HBQHQK-DTJPeU7W.js → chunk-U2HBQHQK-DogcerR6.js} +1 -1
  27. package/dist/assets/{chunk-X2U36JSP-CrTnmMqG.js → chunk-X2U36JSP-CwVWdmZV.js} +1 -1
  28. package/dist/assets/chunk-XPW4576I-DQpNCogT.js +32 -0
  29. package/dist/assets/{chunk-YZCP3GAM-9wq0QKUn.js → chunk-YZCP3GAM-crQSbji9.js} +1 -1
  30. package/dist/assets/{chunk-ZZ45TVLE-D3I1kLlo.js → chunk-ZZ45TVLE-Bk1S1YtS.js} +1 -1
  31. package/dist/assets/classDiagram-6PBFFD2Q-B_TabGaU.js +1 -0
  32. package/dist/assets/classDiagram-v2-HSJHXN6E-CGnZkUWw.js +1 -0
  33. package/dist/assets/clone-D4ka472w.js +1 -0
  34. package/dist/assets/{cose-bilkent-S5V4N54A-BygGvZGW.js → cose-bilkent-S5V4N54A-RBTHUit8.js} +1 -1
  35. package/dist/assets/cytoscape.esm-BGJwlmkf.js +321 -0
  36. package/dist/assets/dagre-B32eYLtm.js +1 -0
  37. package/dist/assets/{dagre-KV5264BT-lveZDhBf.js → dagre-KV5264BT-nX7tuXXn.js} +1 -1
  38. package/dist/assets/diagram-5BDNPKRD-DRxMXlQr.js +10 -0
  39. package/dist/assets/diagram-G4DWMVQ6-CoojevGm.js +24 -0
  40. package/dist/assets/diagram-MMDJMWI5-CWtJyfVW.js +43 -0
  41. package/dist/assets/diagram-TYMM5635-CsDJC4Hq.js +24 -0
  42. package/dist/assets/{erDiagram-SMLLAGMA-dx09stuy.js → erDiagram-SMLLAGMA-Cf7Xtd9A.js} +2 -2
  43. package/dist/assets/{flatten-B2BZ0pzY.js → flatten-CYX_pHZ7.js} +1 -1
  44. package/dist/assets/{flowDiagram-DWJPFMVM-CJi2WISS.js → flowDiagram-DWJPFMVM-DQaeR16a.js} +3 -3
  45. package/dist/assets/{ganttDiagram-T4ZO3ILL-OCTvbRxF.js → ganttDiagram-T4ZO3ILL-8EIcztcH.js} +1 -1
  46. package/dist/assets/gitGraph-7Q5UKJZL-BH9A1SAZ.js +1 -0
  47. package/dist/assets/{gitGraphDiagram-UUTBAWPF-Bjj94M12.js → gitGraphDiagram-UUTBAWPF-DO9ODqYw.js} +1 -1
  48. package/dist/assets/graphlib-bPBqlJKT.js +1 -0
  49. package/dist/assets/identity-Me9aart9.js +1 -0
  50. package/dist/assets/index-BpzHnKdP.css +1 -0
  51. package/dist/assets/index-DmNErTAP.js +273 -0
  52. package/dist/assets/info-OMHHGYJF-BvKR-zWh.js +1 -0
  53. package/dist/assets/infoDiagram-42DDH7IO-pRTXCm5C.js +2 -0
  54. package/dist/assets/isEmpty-Cu0k-j1j.js +1 -0
  55. package/dist/assets/{ishikawaDiagram-UXIWVN3A-Cnc1bwBo.js → ishikawaDiagram-UXIWVN3A-BP2YE5QI.js} +2 -2
  56. package/dist/assets/{journeyDiagram-VCZTEJTY-BkMxoaPq.js → journeyDiagram-VCZTEJTY-B3l2juoL.js} +1 -1
  57. package/dist/assets/{kanban-definition-6JOO6SKY-CwHbIze0.js → kanban-definition-6JOO6SKY-BpIpEOZZ.js} +4 -4
  58. package/dist/assets/{line-DNzQATGr.js → line-otOkzGl8.js} +1 -1
  59. package/dist/assets/mermaid-parser.core-xWsW24Gq.js +4 -0
  60. package/dist/assets/{mindmap-definition-QFDTVHPH-DswAJiEd.js → mindmap-definition-QFDTVHPH-B9khyC7X.js} +3 -3
  61. package/dist/assets/packet-4T2RLAQJ-D8Dw3nmf.js +1 -0
  62. package/dist/assets/pie-ZZUOXDRM-ZghowlAE.js +1 -0
  63. package/dist/assets/{pieDiagram-DEJITSTG-DgQTCddl.js → pieDiagram-DEJITSTG-v32hL3i7.js} +1 -1
  64. package/dist/assets/{quadrantDiagram-34T5L4WZ-c0iZxo2I.js → quadrantDiagram-34T5L4WZ-DIL3GDFt.js} +1 -1
  65. package/dist/assets/radar-PYXPWWZC-D-PK3JOd.js +1 -0
  66. package/dist/assets/reduce-CImcgAcU.js +1 -0
  67. package/dist/assets/{requirementDiagram-MS252O5E-D1moa23Z.js → requirementDiagram-MS252O5E-D8os2-4y.js} +2 -2
  68. package/dist/assets/{sankeyDiagram-XADWPNL6-woJZoQ58.js → sankeyDiagram-XADWPNL6-BV70D4l5.js} +1 -1
  69. package/dist/assets/{sequenceDiagram-FGHM5R23-Dvhj7HGn.js → sequenceDiagram-FGHM5R23-Cwu8hQW1.js} +1 -1
  70. package/dist/assets/stateDiagram-FHFEXIEX-oYUWv7Fb.js +1 -0
  71. package/dist/assets/stateDiagram-v2-QKLJ7IA2-CFUTpFu-.js +1 -0
  72. package/dist/assets/{timeline-definition-GMOUNBTQ-z-IncVmK.js → timeline-definition-GMOUNBTQ-CxSdKxpL.js} +1 -1
  73. package/dist/assets/treeView-SZITEDCU-uVgaJQzG.js +1 -0
  74. package/dist/assets/treemap-W4RFUUIX-Dcad_9AN.js +1 -0
  75. package/dist/assets/vennDiagram-DHZGUBPP-D4wgD7QI.js +34 -0
  76. package/dist/assets/wardley-RL74JXVD-CFXrK8mx.js +1 -0
  77. package/dist/assets/{wardleyDiagram-NUSXRM2D-D-kouujI.js → wardleyDiagram-NUSXRM2D-5Q201ea3.js} +1 -1
  78. package/dist/assets/{xychartDiagram-5P7HB3ND-D1lnM0pL.js → xychartDiagram-5P7HB3ND-BPZv_axd.js} +3 -3
  79. package/dist/index.html +17 -13
  80. package/package.json +2 -4
  81. package/skills/hiro-task-manager-cli/SKILL.md +6 -4
  82. package/skills/hiro-task-manager-cli/reference/cli-access-policy.md +1 -0
  83. package/skills/hiro-task-manager-cli/reference/releases.md +14 -0
  84. package/src/cli/bootstrap/launcher.ts +19 -5
  85. package/src/cli/bootstrap/program.test.ts +46 -0
  86. package/src/cli/bootstrap/program.ts +50 -1
  87. package/src/cli/commands/query.ts +56 -56
  88. package/src/cli/commands/releases.ts +22 -0
  89. package/src/cli/handlers/boards.test.ts +669 -669
  90. package/src/cli/handlers/cli-wiring.test.ts +38 -1
  91. package/src/cli/handlers/releases.ts +15 -0
  92. package/src/cli/handlers/search.test.ts +374 -374
  93. package/src/cli/handlers/search.ts +17 -17
  94. package/src/cli/lib/cli-http-errors.test.ts +85 -85
  95. package/src/cli/lib/launcherUi.test.ts +74 -0
  96. package/src/cli/lib/launcherUi.ts +47 -0
  97. package/src/cli/lib/write/releases.ts +64 -1
  98. package/src/cli/lib/write-result.test.ts +3 -0
  99. package/src/cli/lib/write-result.ts +3 -0
  100. package/src/cli/lib/writeCommands.breadth.test.ts +143 -0
  101. package/src/cli/lib/writeCommands.ts +1 -0
  102. package/src/cli/subprocess.real-stack.test.ts +625 -611
  103. package/src/cli/subprocess.smoke.test.ts +954 -954
  104. package/src/client/api/useBoardChangeStream.ts +421 -168
  105. package/src/client/api/useBoardIndexStream.ts +35 -0
  106. package/src/client/components/board/BoardStatsChips.tsx +233 -233
  107. package/src/client/components/board/BoardStatsContext.tsx +41 -41
  108. package/src/client/components/board/boardHeaderButtonStyles.ts +38 -38
  109. package/src/client/components/board/shortcuts/useBoardShortcutKeydown.ts +49 -49
  110. package/src/client/components/board/useBoardCanvasPanScroll.ts +108 -108
  111. package/src/client/components/board/useBoardTaskContainerDroppableReact.ts +33 -33
  112. package/src/client/components/board/useBoardTaskSortableReact.ts +26 -26
  113. package/src/client/components/layout/AppShell.tsx +5 -2
  114. package/src/client/components/layout/NotificationToasts.tsx +38 -1
  115. package/src/client/components/multi-select.tsx +1206 -1206
  116. package/src/client/components/routing/BoardPage.tsx +20 -20
  117. package/src/client/components/routing/NavigationRegistrar.tsx +13 -13
  118. package/src/client/components/task/TaskCard.tsx +643 -643
  119. package/src/client/components/ui/badge.tsx +49 -49
  120. package/src/client/components/ui/button.tsx +65 -65
  121. package/src/client/components/ui/command.tsx +193 -193
  122. package/src/client/components/ui/dialog.tsx +163 -163
  123. package/src/client/components/ui/input-group.tsx +155 -155
  124. package/src/client/components/ui/input.tsx +19 -19
  125. package/src/client/components/ui/popover.tsx +87 -87
  126. package/src/client/components/ui/separator.tsx +28 -28
  127. package/src/client/components/ui/textarea.tsx +18 -18
  128. package/src/client/index.css +248 -248
  129. package/src/client/lib/appNavigate.ts +16 -16
  130. package/src/client/lib/taskCardDate.ts +111 -111
  131. package/src/client/lib/utils.ts +6 -6
  132. package/src/client/store/notificationUi.ts +14 -0
  133. package/src/server/auth.ts +351 -351
  134. package/src/server/events.ts +31 -4
  135. package/src/server/migrations/registry.ts +43 -43
  136. package/src/server/notificationEvents.ts +8 -1
  137. package/src/server/routes/boards.ts +15 -1
  138. package/src/server/routes/trash.ts +6 -1
  139. package/src/shared/boardEvents.ts +6 -0
  140. package/src/shared/runtimeConfig.ts +256 -256
  141. package/src/shared/skillsInstall.ts +2 -3
  142. package/dist/assets/architecture-YZFGNWBL-C1MoQeSs.js +0 -1
  143. package/dist/assets/architectureDiagram-Q4EWVU46-DUEfvDBu.js +0 -36
  144. package/dist/assets/channel-yBmN_ln0.js +0 -1
  145. package/dist/assets/classDiagram-6PBFFD2Q-Dx_f-9b7.js +0 -1
  146. package/dist/assets/classDiagram-v2-HSJHXN6E-CSfvZ-nt.js +0 -1
  147. package/dist/assets/clone-CXokakwV.js +0 -1
  148. package/dist/assets/cytoscape.esm-BIYWHPG0.js +0 -321
  149. package/dist/assets/dagre-Do0eD9eI.js +0 -1
  150. package/dist/assets/diagram-5BDNPKRD-Dq5yM_uY.js +0 -10
  151. package/dist/assets/diagram-G4DWMVQ6-D-SYOmKm.js +0 -24
  152. package/dist/assets/diagram-MMDJMWI5-lU5t9BZA.js +0 -43
  153. package/dist/assets/diagram-TYMM5635-6tfUbY3R.js +0 -24
  154. package/dist/assets/gitGraph-7Q5UKJZL-BXTuQaDM.js +0 -1
  155. package/dist/assets/graphlib-BIlXYGdM.js +0 -1
  156. package/dist/assets/identity-D4WOnl_h.js +0 -1
  157. package/dist/assets/index-CZZuue3D.js +0 -304
  158. package/dist/assets/index-hMFTu7sr.css +0 -1
  159. package/dist/assets/info-OMHHGYJF-BeeKt8-X.js +0 -1
  160. package/dist/assets/infoDiagram-42DDH7IO-wq_opQKO.js +0 -2
  161. package/dist/assets/mermaid-parser.core-DrLhKJ48.js +0 -4
  162. package/dist/assets/packet-4T2RLAQJ-DQ-H9_jd.js +0 -1
  163. package/dist/assets/pie-ZZUOXDRM-BSj0Jsyj.js +0 -1
  164. package/dist/assets/radar-PYXPWWZC-B7-oRPFL.js +0 -1
  165. package/dist/assets/reduce-Uumu9GdR.js +0 -1
  166. package/dist/assets/stateDiagram-FHFEXIEX-Dx5CjenB.js +0 -1
  167. package/dist/assets/stateDiagram-v2-QKLJ7IA2-C_PkrTdc.js +0 -1
  168. package/dist/assets/treeView-SZITEDCU-CFXle9Az.js +0 -1
  169. package/dist/assets/treemap-W4RFUUIX-CAW3vWh8.js +0 -1
  170. package/dist/assets/vennDiagram-DHZGUBPP-CT1ehozU.js +0 -34
  171. package/dist/assets/wardley-RL74JXVD-7q3ju4kc.js +0 -1
  172. package/scripts/postinstall-message.mjs +0 -160
  173. /package/dist/assets/{chunk-4BX2VUAB-ean5NKtU.js → chunk-4BX2VUAB-C70mcfQR.js} +0 -0
  174. /package/dist/assets/{chunk-55IACEB6-CvSRyJqy.js → chunk-55IACEB6-CWfnqcLM.js} +0 -0
  175. /package/dist/assets/{chunk-BSJP7CBP-D8kBlJsf.js → chunk-BSJP7CBP-B0LrXV9y.js} +0 -0
  176. /package/dist/assets/{chunk-FMBD7UC4-DrNhFt1N.js → chunk-FMBD7UC4-_mV71Mwu.js} +0 -0
  177. /package/dist/assets/{chunk-QZHKN3VN-Csp3OYJY.js → chunk-QZHKN3VN-t2nrsegL.js} +0 -0
  178. /package/dist/assets/{katex-8mXVa4k3.js → katex-B2dtGfSp.js} +0 -0
  179. /package/dist/assets/{rough.esm-DtEqI08j.js → rough.esm-DEh6Frf9.js} +0 -0
package/dist/index.html CHANGED
@@ -25,24 +25,28 @@
25
25
  } catch (e) {}
26
26
  })();
27
27
  </script>
28
- <script type="module" crossorigin src="/assets/index-CZZuue3D.js"></script>
28
+ <script type="module" crossorigin src="/assets/index-DmNErTAP.js"></script>
29
29
  <link rel="modulepreload" crossorigin href="/assets/chunk-CFjPhJqf.js">
30
30
  <link rel="modulepreload" crossorigin href="/assets/src-C47h8eAM.js">
31
- <link rel="modulepreload" crossorigin href="/assets/chunk-ICPOFSXX-BNR1V8rT.js">
31
+ <link rel="modulepreload" crossorigin href="/assets/chunk-ICPOFSXX-DkUVjrLw.js">
32
32
  <link rel="modulepreload" crossorigin href="/assets/dist-BXMOO6xX.js">
33
- <link rel="modulepreload" crossorigin href="/assets/identity-D4WOnl_h.js">
34
- <link rel="modulepreload" crossorigin href="/assets/chunk-5PVQY5BW-BrmXs2Gs.js">
35
- <link rel="modulepreload" crossorigin href="/assets/chunk-U2HBQHQK-DTJPeU7W.js">
36
- <link rel="modulepreload" crossorigin href="/assets/chunk-X2U36JSP-CrTnmMqG.js">
37
- <link rel="modulepreload" crossorigin href="/assets/chunk-ZZ45TVLE-D3I1kLlo.js">
38
- <link rel="modulepreload" crossorigin href="/assets/rough.esm-DtEqI08j.js">
39
- <link rel="modulepreload" crossorigin href="/assets/chunk-5FUZZQ4R-XEga0hMC.js">
40
- <link rel="modulepreload" crossorigin href="/assets/chunk-BSJP7CBP-D8kBlJsf.js">
33
+ <link rel="modulepreload" crossorigin href="/assets/identity-Me9aart9.js">
34
+ <link rel="modulepreload" crossorigin href="/assets/chunk-5PVQY5BW-cGfZCZGU.js">
35
+ <link rel="modulepreload" crossorigin href="/assets/chunk-U2HBQHQK-DogcerR6.js">
36
+ <link rel="modulepreload" crossorigin href="/assets/isEmpty-Cu0k-j1j.js">
37
+ <link rel="modulepreload" crossorigin href="/assets/chunk-X2U36JSP-CwVWdmZV.js">
38
+ <link rel="modulepreload" crossorigin href="/assets/chunk-ZZ45TVLE-Bk1S1YtS.js">
39
+ <link rel="modulepreload" crossorigin href="/assets/rough.esm-DEh6Frf9.js">
40
+ <link rel="modulepreload" crossorigin href="/assets/chunk-5FUZZQ4R-B_HuuUjf.js">
41
41
  <link rel="modulepreload" crossorigin href="/assets/path-CIRGLb_6.js">
42
42
  <link rel="modulepreload" crossorigin href="/assets/array-BCJ35G43.js">
43
- <link rel="modulepreload" crossorigin href="/assets/line-DNzQATGr.js">
44
- <link rel="modulepreload" crossorigin href="/assets/chunk-ENJZ2VHE-BgZKYo1l.js">
45
- <link rel="stylesheet" crossorigin href="/assets/index-hMFTu7sr.css">
43
+ <link rel="modulepreload" crossorigin href="/assets/line-otOkzGl8.js">
44
+ <link rel="modulepreload" crossorigin href="/assets/chunk-BSJP7CBP-B0LrXV9y.js">
45
+ <link rel="modulepreload" crossorigin href="/assets/chunk-ENJZ2VHE-DrWzOrpd.js">
46
+ <link rel="modulepreload" crossorigin href="/assets/chunk-336JU56O-BGQvSwLk.js">
47
+ <link rel="modulepreload" crossorigin href="/assets/chunk-426QAEUC-Cl9nQN9c.js">
48
+ <link rel="modulepreload" crossorigin href="/assets/chunk-XPW4576I-DQpNCogT.js">
49
+ <link rel="stylesheet" crossorigin href="/assets/index-BpzHnKdP.css">
46
50
  </head>
47
51
  <body>
48
52
  <div id="root"></div>
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@hiroleague/taskmanager",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "type": "module",
5
- "description": "Local-only task board app (Bun + Hono + React)",
5
+ "description": "Task Manager for Solo Builders and AI Agents, working as a team",
6
6
  "license": "MIT",
7
7
  "repository": {
8
8
  "type": "git",
@@ -22,7 +22,6 @@
22
22
  "skills",
23
23
  "LICENSE",
24
24
  "README.md",
25
- "scripts/postinstall-message.mjs",
26
25
  "scripts/stubs/node-domexception"
27
26
  ],
28
27
  "overrides": {
@@ -33,7 +32,6 @@
33
32
  "hirotm": "./src/cli/bin/hirotm.ts"
34
33
  },
35
34
  "scripts": {
36
- "postinstall": "node scripts/postinstall-message.mjs",
37
35
  "app": "bun run src/cli/bin/hirotaskmanager.ts",
38
36
  "cli": "bun run src/cli/bin/hirotm.ts",
39
37
  "dev": "concurrently -k -n api,web -c blue,green \"npm run dev:server\" \"npm run dev:client\"",
@@ -39,7 +39,9 @@ If you are not sure, use a generic name "AI Agent"
39
39
 
40
40
  ## Installation
41
41
 
42
- If command is not found, ask the user to [install](https://docs.hiroleague.com/task-manager/get-started/quick-start) it and configure it.
42
+ The `hirotm` binary ships with the **`@hiroleague/taskmanager`** npm package ([npm](https://www.npmjs.com/package/@hiroleague/taskmanager), [source](https://github.com/hiro-league/hirotaskmanager)).
43
+
44
+ If the command is not found, ask the user to [install](https://docs.hiroleague.com/task-manager/get-started/quickstart) it and configure it.
43
45
 
44
46
  # Discovery
45
47
 
@@ -70,12 +72,12 @@ If you are not allowed to access an entity or perform an operation due to CLI Ac
70
72
 
71
73
  ## References
72
74
 
73
- - [Installation Guide](https://docs.hiroleague.com/task-manager/get-started/quick-start)
75
+ - [Installation Guide](https://docs.hiroleague.com/task-manager/get-started/quickstart)
74
76
  - Server Commands - Start, stop, and check the server status.
75
77
  - [Boards Commands](reference/boards.md) - Create, update, delete, list, describe, and configure boards.
76
78
  - [Lists Commands](reference/lists.md) - List, add, update, move, delete, restore, and purge board lists.
77
79
  - [Tasks Commands](reference/tasks.md) - List, add, update, move, delete, restore, and purge tasks.
78
- - [Releases Commands](reference/releases.md) - List, show, add, update, and delete releases.
80
+ - [Releases Commands](reference/releases.md) - List, show, add, update, delete, and set-default releases.
79
81
  - [Trash Commands](reference/trash.md) - Inspect trashed boards, lists, and tasks.
80
82
  - [Status Commands](reference/statuses.md) - List workflow statuses and their meanings.
81
83
  - [Search Commands](reference/search.md) - Full-text task search with `query search`.
@@ -94,4 +96,4 @@ If you are not allowed to access an entity or perform an operation due to CLI Ac
94
96
 
95
97
  **References**
96
98
 
97
- - [Online Documentation](https://docs.hiroleague.com/task-manager/get-started/quick-start)
99
+ - [Online Documentation](https://docs.hiroleague.com/task-manager/get-started/quickstart)
@@ -54,6 +54,7 @@ Use this page to map `hirotm` commands to the board CLI policy checks enforced b
54
54
  - `releases add`: `readBoard` + `manageStructure`
55
55
  - `releases update`: `readBoard` + `manageStructure`
56
56
  - `releases delete`: `readBoard` + `manageStructure`
57
+ - `releases set-default`: `readBoard` + `manageStructure`
57
58
 
58
59
  ### Search and trash
59
60
 
@@ -85,3 +85,17 @@ Delete a release from a board.
85
85
 
86
86
  - `--move-tasks-to <id>`: move tagged tasks to another release before deletion.
87
87
  - If omitted, tasks on that release become untagged.
88
+
89
+ ### `releases set-default`
90
+
91
+ Format:
92
+
93
+ ```bash
94
+ hirotm releases set-default --board <id-or-slug> <release-id>
95
+ hirotm releases set-default --board <id-or-slug> --clear
96
+ ```
97
+
98
+ Set or clear the board’s default release (the release used for new tasks when the board’s auto-assign rules apply). This PATCHes the board (`defaultReleaseId`); requires `manageStructure` on the board for CLI clients.
99
+
100
+ - Provide `<release-id>` to set the default, or `--clear` to remove it.
101
+ - Do not pass `<release-id>` together with `--clear`.
@@ -29,6 +29,8 @@ import {
29
29
  formatTextPrompt,
30
30
  isAuthInitialized,
31
31
  paintValue,
32
+ printSetupContinuePrompt,
33
+ printSetupNextSteps,
32
34
  printPassphraseHint,
33
35
  printRecoveryKey,
34
36
  printRecoveryKeyExitHint,
@@ -319,7 +321,7 @@ async function waitForRecoveryKeyFile(authDir: string): Promise<string> {
319
321
  return key;
320
322
  }
321
323
 
322
- async function waitForEnterToExitLauncher(): Promise<void> {
324
+ async function waitForEnterKey(): Promise<void> {
323
325
  const rl = createInterface({
324
326
  input: process.stdin,
325
327
  output: process.stdout,
@@ -383,9 +385,21 @@ export function createHirotaskmanagerProgram(): Command {
383
385
  },
384
386
  };
385
387
 
386
- // Safety net: copy bundled skills to ~/.taskmanager/skills/ if
387
- // postinstall was skipped (--ignore-scripts, CI, bunx) or stale.
388
- ensureBundledSkills();
388
+ // Registry installs can skip lifecycle hooks, so setup itself must
389
+ // print the exact `npx skills` commands users should run next.
390
+ const skillsInstalled = ensureBundledSkills();
391
+ if (shouldRunSetup) {
392
+ printSetupNextSteps({
393
+ profileName: selectedProfile,
394
+ skillsInstalled,
395
+ });
396
+ if (setupResult.setupMeta.justFinishedInteractiveSetup) {
397
+ // Keep setup blocked here so users see the required skills step
398
+ // before the server starts and the browser steals focus.
399
+ printSetupContinuePrompt();
400
+ await waitForEnterKey();
401
+ }
402
+ }
389
403
 
390
404
  const launcherConfig = setupResult.config;
391
405
 
@@ -471,7 +485,7 @@ export function createHirotaskmanagerProgram(): Command {
471
485
  const recoveryKey = await waitForRecoveryKeyFile(authDir);
472
486
  printRecoveryKey(recoveryKey);
473
487
  printRecoveryKeyExitHint(runningUrl);
474
- await waitForEnterToExitLauncher();
488
+ await waitForEnterKey();
475
489
  }
476
490
  } finally {
477
491
  if (previousSilentStartup === undefined) {
@@ -0,0 +1,46 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import {
3
+ getHirotmLauncherSetupCommand,
4
+ shouldRequireLauncherSetupForHirotm,
5
+ } from "./program";
6
+
7
+ describe("shouldRequireLauncherSetupForHirotm", () => {
8
+ test("requires launcher setup for installed mode without a saved profile", () => {
9
+ expect(
10
+ shouldRequireLauncherSetupForHirotm({
11
+ runtimeKind: "installed",
12
+ hasInstalledProfileConfig: false,
13
+ }),
14
+ ).toBe(true);
15
+ });
16
+
17
+ test("allows installed mode once the profile config exists", () => {
18
+ expect(
19
+ shouldRequireLauncherSetupForHirotm({
20
+ runtimeKind: "installed",
21
+ hasInstalledProfileConfig: true,
22
+ }),
23
+ ).toBe(false);
24
+ });
25
+
26
+ test("never blocks dev mode on launcher setup", () => {
27
+ expect(
28
+ shouldRequireLauncherSetupForHirotm({
29
+ runtimeKind: "dev",
30
+ hasInstalledProfileConfig: false,
31
+ }),
32
+ ).toBe(false);
33
+ });
34
+ });
35
+
36
+ describe("getHirotmLauncherSetupCommand", () => {
37
+ test("uses the plain launcher command for the default profile", () => {
38
+ expect(getHirotmLauncherSetupCommand("default")).toBe("hirotaskmanager");
39
+ });
40
+
41
+ test("includes the selected profile for named profiles", () => {
42
+ expect(getHirotmLauncherSetupCommand("work")).toBe(
43
+ "hirotaskmanager --profile work",
44
+ );
45
+ });
46
+ });
@@ -8,8 +8,56 @@ import { registerStatusCommands } from "../commands/statuses";
8
8
  import { registerTaskCommands } from "../commands/tasks";
9
9
  import { registerTrashCommands } from "../commands/trash";
10
10
  import { createDefaultCliContext } from "../handlers/context";
11
+ import { hasCliConfigFile, resolveProfileName, resolveRuntimeKind } from "../lib/config";
11
12
  import { syncCliOutputFormatFromGlobals } from "../lib/cliFormat";
12
- import { exitWithError, resetCliOutputFormat } from "../lib/output";
13
+ import { CliError, exitWithError, resetCliOutputFormat } from "../lib/output";
14
+ import { CLI_ERR } from "../types/errors";
15
+
16
+ export function shouldRequireLauncherSetupForHirotm(options: {
17
+ runtimeKind: "installed" | "dev";
18
+ hasInstalledProfileConfig: boolean;
19
+ }): boolean {
20
+ return (
21
+ options.runtimeKind === "installed" &&
22
+ options.hasInstalledProfileConfig === false
23
+ );
24
+ }
25
+
26
+ export function getHirotmLauncherSetupCommand(profileName: string): string {
27
+ return profileName === "default"
28
+ ? "hirotaskmanager"
29
+ : `hirotaskmanager --profile ${profileName}`;
30
+ }
31
+
32
+ function ensureInstalledProfileIsReadyForHirotm(): void {
33
+ const runtimeKind = resolveRuntimeKind();
34
+ const profileName = resolveProfileName({ kind: "installed" });
35
+ const hasInstalledProfileConfig = hasCliConfigFile({
36
+ profile: profileName,
37
+ kind: "installed",
38
+ });
39
+ if (
40
+ !shouldRequireLauncherSetupForHirotm({
41
+ runtimeKind,
42
+ hasInstalledProfileConfig,
43
+ })
44
+ ) {
45
+ return;
46
+ }
47
+
48
+ const setupCommand = getHirotmLauncherSetupCommand(profileName);
49
+ // Package managers can skip lifecycle scripts, so actionable `hirotm`
50
+ // commands must direct users back to the launcher for first-run setup.
51
+ throw new CliError(
52
+ `No installed TaskManager profile found for "${profileName}". Run \`${setupCommand}\` first to create and configure this profile.`,
53
+ 2,
54
+ {
55
+ code: CLI_ERR.missingRequired,
56
+ profile: profileName,
57
+ hint: `Run \`${setupCommand}\` first.`,
58
+ },
59
+ );
60
+ }
13
61
 
14
62
  /**
15
63
  * Build the hirotm Commander program.
@@ -45,6 +93,7 @@ export function createHirotmProgram(): Command {
45
93
  quiet?: boolean;
46
94
  };
47
95
  syncCliOutputFormatFromGlobals(opts);
96
+ ensureInstalledProfileIsReadyForHirotm();
48
97
  });
49
98
 
50
99
  const ctx = createDefaultCliContext();
@@ -1,56 +1,56 @@
1
- import { Command } from "commander";
2
- import type { CliContext } from "../types/context";
3
- import { handleSearch } from "../handlers/search";
4
- import {
5
- addClientNameOption,
6
- CLI_FIELDS_OPTION_DESC,
7
- cliAction,
8
- } from "../lib/command-helpers";
9
- import { CLI_DEFAULTS } from "../lib/constants";
10
-
11
- export function registerQueryCommands(
12
- program: Command,
13
- ctx: CliContext,
14
- ): void {
15
- const query = program
16
- .command("query")
17
- .description("Read-only queries across boards (search, etc.)");
18
-
19
- addClientNameOption(
20
- query
21
- .command("search")
22
- .description(
23
- "Search tasks (title, body, list name, group & status labels) via FTS5",
24
- )
25
- .argument("<query...>", "Search query (quote phrases with spaces)")
26
- .option("--board <id-or-slug>", "Limit results to one board")
27
- .option(
28
- "--limit <n>",
29
- `Page size (default ${CLI_DEFAULTS.DEFAULT_SEARCH_LIMIT}, max ${CLI_DEFAULTS.MAX_PAGE_LIMIT})`,
30
- )
31
- .option("--offset <n>", "Skip this many hits (default 0)")
32
- .option(
33
- "--page-all",
34
- "Fetch every page at the current --limit and merge into one result set",
35
- )
36
- .option(
37
- "--no-prefix",
38
- "Do not add * to the last token (exact token only). Default matches prefixes (drag finds dragging); this flag does not",
39
- )
40
- .option("--fields <keys>", CLI_FIELDS_OPTION_DESC),
41
- ).action(
42
- cliAction(
43
- (
44
- queryParts: string[],
45
- options: {
46
- board?: string;
47
- limit?: string;
48
- offset?: string;
49
- pageAll?: boolean;
50
- noPrefix?: boolean;
51
- fields?: string;
52
- },
53
- ) => handleSearch(ctx, queryParts, options),
54
- ),
55
- );
56
- }
1
+ import { Command } from "commander";
2
+ import type { CliContext } from "../types/context";
3
+ import { handleSearch } from "../handlers/search";
4
+ import {
5
+ addClientNameOption,
6
+ CLI_FIELDS_OPTION_DESC,
7
+ cliAction,
8
+ } from "../lib/command-helpers";
9
+ import { CLI_DEFAULTS } from "../lib/constants";
10
+
11
+ export function registerQueryCommands(
12
+ program: Command,
13
+ ctx: CliContext,
14
+ ): void {
15
+ const query = program
16
+ .command("query")
17
+ .description("Read-only queries across boards (search, etc.)");
18
+
19
+ addClientNameOption(
20
+ query
21
+ .command("search")
22
+ .description(
23
+ "Search tasks (title, body, list name, group & status labels) via FTS5",
24
+ )
25
+ .argument("<query...>", "Search query (quote phrases with spaces)")
26
+ .option("--board <id-or-slug>", "Limit results to one board")
27
+ .option(
28
+ "--limit <n>",
29
+ `Page size (default ${CLI_DEFAULTS.DEFAULT_SEARCH_LIMIT}, max ${CLI_DEFAULTS.MAX_PAGE_LIMIT})`,
30
+ )
31
+ .option("--offset <n>", "Skip this many hits (default 0)")
32
+ .option(
33
+ "--page-all",
34
+ "Fetch every page at the current --limit and merge into one result set",
35
+ )
36
+ .option(
37
+ "--no-prefix",
38
+ "Do not add * to the last token (exact token only). Default matches prefixes (drag finds dragging); this flag does not",
39
+ )
40
+ .option("--fields <keys>", CLI_FIELDS_OPTION_DESC),
41
+ ).action(
42
+ cliAction(
43
+ (
44
+ queryParts: string[],
45
+ options: {
46
+ board?: string;
47
+ limit?: string;
48
+ offset?: string;
49
+ pageAll?: boolean;
50
+ noPrefix?: boolean;
51
+ fields?: string;
52
+ },
53
+ ) => handleSearch(ctx, queryParts, options),
54
+ ),
55
+ );
56
+ }
@@ -4,6 +4,7 @@ import {
4
4
  handleReleasesAdd,
5
5
  handleReleasesDelete,
6
6
  handleReleasesList,
7
+ handleReleasesSetDefault,
7
8
  handleReleasesShow,
8
9
  handleReleasesUpdate,
9
10
  } from "../handlers/releases";
@@ -84,6 +85,27 @@ export function registerReleaseCommands(
84
85
  }) => handleReleasesAdd(ctx, options)),
85
86
  );
86
87
 
88
+ addClientNameOption(
89
+ releasesCommand
90
+ .command("set-default")
91
+ .description(
92
+ "Set or clear the board default release (PATCH board; requires manageStructure)",
93
+ )
94
+ .requiredOption("--board <id-or-slug>", "Board id or slug")
95
+ .option("--clear", "Clear the board default release")
96
+ .argument(
97
+ "[release-id]",
98
+ "Numeric release id to use as default (omit when using --clear)",
99
+ ),
100
+ ).action(
101
+ cliAction(
102
+ (
103
+ releaseId: string | undefined,
104
+ options: { board: string; clear?: boolean },
105
+ ) => handleReleasesSetDefault(ctx, releaseId, options),
106
+ ),
107
+ );
108
+
87
109
  addClientNameOption(
88
110
  releasesCommand
89
111
  .command("update")