@hiroleague/taskmanager 0.0.1 → 0.0.3

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 (196) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -52
  3. package/dist/assets/architecture-YZFGNWBL-DoE0KxgG.js +1 -0
  4. package/dist/assets/architectureDiagram-Q4EWVU46-DeuBhy7X.js +36 -0
  5. package/dist/assets/{blockDiagram-DXYQGD6D-DfOGNphI.js → blockDiagram-DXYQGD6D-BDBy9ns9.js} +1 -1
  6. package/dist/assets/{c4Diagram-AHTNJAMY-B2Yfcwbo.js → c4Diagram-AHTNJAMY-CpqJj_8a.js} +1 -1
  7. package/dist/assets/channel-PHRyjspt.js +1 -0
  8. package/dist/assets/{chunk-2KRD3SAO-9yt00aGC.js → chunk-2KRD3SAO-DEpUsxdZ.js} +1 -1
  9. package/dist/assets/chunk-336JU56O-BGQvSwLk.js +2 -0
  10. package/dist/assets/chunk-426QAEUC-Cl9nQN9c.js +1 -0
  11. package/dist/assets/{chunk-4TB4RGXK-DF8yJBFl.js → chunk-4TB4RGXK-Dq7aiIrZ.js} +2 -2
  12. package/dist/assets/{chunk-5FUZZQ4R-XEga0hMC.js → chunk-5FUZZQ4R-B_HuuUjf.js} +1 -1
  13. package/dist/assets/{chunk-5PVQY5BW-BrmXs2Gs.js → chunk-5PVQY5BW-cGfZCZGU.js} +2 -2
  14. package/dist/assets/{chunk-67CJDMHE-5wFKo04G.js → chunk-67CJDMHE-BMYAVZfw.js} +1 -1
  15. package/dist/assets/{chunk-7N4EOEYR-BRRGX_NC.js → chunk-7N4EOEYR-Ct-EY7Nc.js} +1 -1
  16. package/dist/assets/{chunk-AA7GKIK3-DUZv_pNI.js → chunk-AA7GKIK3-Bd4HFpeo.js} +1 -1
  17. package/dist/assets/{chunk-CIAEETIT-mA5aM_d7.js → chunk-CIAEETIT-CrFUkPMT.js} +1 -1
  18. package/dist/assets/{chunk-EDXVE4YY-DxUqDyxy.js → chunk-EDXVE4YY-DMDyt0NF.js} +1 -1
  19. package/dist/assets/{chunk-ENJZ2VHE-BgZKYo1l.js → chunk-ENJZ2VHE-DrWzOrpd.js} +1 -1
  20. package/dist/assets/{chunk-FOC6F5B3-B-cqGCPC.js → chunk-FOC6F5B3-Bemzq96j.js} +1 -1
  21. package/dist/assets/{chunk-ICPOFSXX-BNR1V8rT.js → chunk-ICPOFSXX-DkUVjrLw.js} +5 -5
  22. package/dist/assets/{chunk-K5T4RW27-BLRDzioh.js → chunk-K5T4RW27-ALKIf000.js} +5 -5
  23. package/dist/assets/{chunk-KGLVRYIC-CTkQSeKy.js → chunk-KGLVRYIC-Bg6HNTZ-.js} +1 -1
  24. package/dist/assets/{chunk-LIHQZDEY-Cf34Nu3J.js → chunk-LIHQZDEY-DeyGongE.js} +1 -1
  25. package/dist/assets/{chunk-ORNJ4GCN-D3uXgbay.js → chunk-ORNJ4GCN-Bx83s1bJ.js} +1 -1
  26. package/dist/assets/{chunk-OYMX7WX6-syQho5jf.js → chunk-OYMX7WX6-BqRUtRpL.js} +1 -1
  27. package/dist/assets/{chunk-U2HBQHQK-DTJPeU7W.js → chunk-U2HBQHQK-DogcerR6.js} +1 -1
  28. package/dist/assets/{chunk-X2U36JSP-CrTnmMqG.js → chunk-X2U36JSP-CwVWdmZV.js} +1 -1
  29. package/dist/assets/chunk-XPW4576I-DQpNCogT.js +32 -0
  30. package/dist/assets/{chunk-YZCP3GAM-9wq0QKUn.js → chunk-YZCP3GAM-crQSbji9.js} +1 -1
  31. package/dist/assets/{chunk-ZZ45TVLE-D3I1kLlo.js → chunk-ZZ45TVLE-Bk1S1YtS.js} +1 -1
  32. package/dist/assets/classDiagram-6PBFFD2Q-B_TabGaU.js +1 -0
  33. package/dist/assets/classDiagram-v2-HSJHXN6E-CGnZkUWw.js +1 -0
  34. package/dist/assets/clone-D4ka472w.js +1 -0
  35. package/dist/assets/{cose-bilkent-S5V4N54A-BygGvZGW.js → cose-bilkent-S5V4N54A-RBTHUit8.js} +1 -1
  36. package/dist/assets/cytoscape.esm-BGJwlmkf.js +321 -0
  37. package/dist/assets/dagre-B32eYLtm.js +1 -0
  38. package/dist/assets/{dagre-KV5264BT-BBqulDtd.js → dagre-KV5264BT-nX7tuXXn.js} +1 -1
  39. package/dist/assets/diagram-5BDNPKRD-DRxMXlQr.js +10 -0
  40. package/dist/assets/diagram-G4DWMVQ6-CoojevGm.js +24 -0
  41. package/dist/assets/diagram-MMDJMWI5-CWtJyfVW.js +43 -0
  42. package/dist/assets/diagram-TYMM5635-CsDJC4Hq.js +24 -0
  43. package/dist/assets/{erDiagram-SMLLAGMA-BN5eJerP.js → erDiagram-SMLLAGMA-Cf7Xtd9A.js} +2 -2
  44. package/dist/assets/{flatten-C5NL-f24.js → flatten-CYX_pHZ7.js} +1 -1
  45. package/dist/assets/{flowDiagram-DWJPFMVM-CbFskc8S.js → flowDiagram-DWJPFMVM-DQaeR16a.js} +3 -3
  46. package/dist/assets/{ganttDiagram-T4ZO3ILL-OCTvbRxF.js → ganttDiagram-T4ZO3ILL-8EIcztcH.js} +1 -1
  47. package/dist/assets/gitGraph-7Q5UKJZL-BH9A1SAZ.js +1 -0
  48. package/dist/assets/{gitGraphDiagram-UUTBAWPF-wpqI2kyI.js → gitGraphDiagram-UUTBAWPF-DO9ODqYw.js} +1 -1
  49. package/dist/assets/graphlib-bPBqlJKT.js +1 -0
  50. package/dist/assets/identity-Me9aart9.js +1 -0
  51. package/dist/assets/index-oKG1C41_.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-Epc23N_0.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-C8dW_26n.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-CvpNtrKT.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-eENymoXZ.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-CmRO3hLp.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-B7qNcwNo.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-CQWqDPGG.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-DNhPIFCg.js → wardleyDiagram-NUSXRM2D-5Q201ea3.js} +1 -1
  78. package/dist/assets/{xychartDiagram-5P7HB3ND-BDblAZ11.js → xychartDiagram-5P7HB3ND-BPZv_axd.js} +3 -3
  79. package/dist/index.html +16 -12
  80. package/package.json +99 -92
  81. package/scripts/stubs/node-domexception/index.cjs +18 -0
  82. package/scripts/stubs/node-domexception/package.json +7 -0
  83. package/skills/hiro-task-manager-cli/SKILL.md +97 -0
  84. package/skills/hiro-task-manager-cli/reference/boards.md +143 -0
  85. package/skills/hiro-task-manager-cli/reference/cli-access-policy.md +72 -0
  86. package/skills/hiro-task-manager-cli/reference/errors.md +85 -0
  87. package/skills/hiro-task-manager-cli/reference/lists.md +106 -0
  88. package/skills/hiro-task-manager-cli/reference/releases.md +87 -0
  89. package/skills/hiro-task-manager-cli/reference/search.md +38 -0
  90. package/skills/hiro-task-manager-cli/reference/statuses.md +25 -0
  91. package/skills/hiro-task-manager-cli/reference/tasks.md +144 -0
  92. package/skills/hiro-task-manager-cli/reference/trash.md +50 -0
  93. package/src/cli/bootstrap/launcher.test.ts +66 -0
  94. package/src/cli/bootstrap/launcher.ts +389 -35
  95. package/src/cli/bootstrap/program.test.ts +46 -0
  96. package/src/cli/bootstrap/program.ts +54 -1
  97. package/src/cli/bootstrap/runtime.test.ts +15 -0
  98. package/src/cli/bootstrap/runtime.ts +27 -1
  99. package/src/cli/commands/query.ts +56 -56
  100. package/src/cli/commands/server.ts +27 -19
  101. package/src/cli/handlers/boards.test.ts +669 -669
  102. package/src/cli/handlers/cli-wiring.test.ts +1 -1
  103. package/src/cli/handlers/search.test.ts +374 -374
  104. package/src/cli/handlers/search.ts +17 -17
  105. package/src/cli/handlers/server.test.ts +55 -13
  106. package/src/cli/handlers/server.ts +16 -3
  107. package/src/cli/lib/api-client.test.ts +35 -2
  108. package/src/cli/lib/api-client.ts +43 -10
  109. package/src/cli/lib/cli-http-errors.test.ts +85 -85
  110. package/src/cli/lib/command-helpers.ts +161 -154
  111. package/src/cli/lib/config.ts +4 -0
  112. package/src/cli/lib/launcherUi.test.ts +74 -0
  113. package/src/cli/lib/launcherUi.ts +213 -0
  114. package/src/cli/lib/process.test.ts +24 -5
  115. package/src/cli/lib/process.ts +86 -55
  116. package/src/cli/ports/process.ts +8 -2
  117. package/src/cli/subprocess.real-stack.test.ts +611 -598
  118. package/src/cli/subprocess.smoke.test.ts +954 -969
  119. package/src/cli/types/config.ts +2 -6
  120. package/src/client/components/auth/AuthScreen.tsx +3 -3
  121. package/src/client/components/board/BoardStatsChips.tsx +233 -233
  122. package/src/client/components/board/BoardStatsContext.tsx +41 -41
  123. package/src/client/components/board/boardHeaderButtonStyles.ts +38 -38
  124. package/src/client/components/board/shortcuts/useBoardShortcutKeydown.ts +49 -49
  125. package/src/client/components/board/useBoardCanvasPanScroll.ts +108 -108
  126. package/src/client/components/board/useBoardTaskContainerDroppableReact.ts +33 -33
  127. package/src/client/components/board/useBoardTaskSortableReact.ts +26 -26
  128. package/src/client/components/multi-select.tsx +1206 -1206
  129. package/src/client/components/routing/BoardPage.tsx +20 -20
  130. package/src/client/components/routing/NavigationRegistrar.tsx +13 -13
  131. package/src/client/components/settings/SettingsPage.tsx +1 -1
  132. package/src/client/components/task/TaskCard.tsx +643 -643
  133. package/src/client/components/ui/badge.tsx +49 -49
  134. package/src/client/components/ui/button.tsx +65 -65
  135. package/src/client/components/ui/command.tsx +193 -193
  136. package/src/client/components/ui/dialog.tsx +163 -163
  137. package/src/client/components/ui/input-group.tsx +155 -155
  138. package/src/client/components/ui/input.tsx +19 -19
  139. package/src/client/components/ui/popover.tsx +87 -87
  140. package/src/client/components/ui/separator.tsx +28 -28
  141. package/src/client/components/ui/textarea.tsx +18 -18
  142. package/src/client/index.css +248 -248
  143. package/src/client/lib/appNavigate.ts +16 -16
  144. package/src/client/lib/taskCardDate.ts +111 -111
  145. package/src/client/lib/utils.ts +6 -6
  146. package/src/server/auth.ts +351 -302
  147. package/src/server/bootstrapDev.ts +11 -2
  148. package/src/server/bootstrapInstalled.ts +6 -1
  149. package/src/server/index.ts +33 -7
  150. package/src/server/migrations/013_cli_policy_and_provenance.ts +2 -2
  151. package/src/server/migrations/019_cli_global_create_board_default_on.ts +14 -0
  152. package/src/server/migrations/registry.ts +43 -41
  153. package/src/server/parseBootstrapProfile.ts +42 -0
  154. package/src/server/storage/cliPolicy.ts +2 -1
  155. package/src/shared/runtimeConfig.ts +256 -237
  156. package/src/shared/runtimeIdentity.test.ts +47 -0
  157. package/src/shared/runtimeIdentity.ts +35 -0
  158. package/src/shared/serverStatus.ts +21 -0
  159. package/src/shared/skillsInstall.ts +70 -0
  160. package/src/shared/terminalColors.ts +24 -0
  161. package/dist/assets/architecture-YZFGNWBL-3h1eIYfB.js +0 -1
  162. package/dist/assets/architectureDiagram-Q4EWVU46-DSQ1_74_.js +0 -36
  163. package/dist/assets/channel-yBmN_ln0.js +0 -1
  164. package/dist/assets/classDiagram-6PBFFD2Q-CotFZI8-.js +0 -1
  165. package/dist/assets/classDiagram-v2-HSJHXN6E-DAPzeDGn.js +0 -1
  166. package/dist/assets/clone-BRQpYu_n.js +0 -1
  167. package/dist/assets/cytoscape.esm-BIYWHPG0.js +0 -321
  168. package/dist/assets/dagre-rhyPjnsQ.js +0 -1
  169. package/dist/assets/diagram-5BDNPKRD-Ky3EXXj0.js +0 -10
  170. package/dist/assets/diagram-G4DWMVQ6-t7LbT0Uz.js +0 -24
  171. package/dist/assets/diagram-MMDJMWI5-CdnLXEMx.js +0 -43
  172. package/dist/assets/diagram-TYMM5635-CnzTqJBM.js +0 -24
  173. package/dist/assets/gitGraph-7Q5UKJZL-CG8f8JF7.js +0 -1
  174. package/dist/assets/graphlib-COiJG5Qv.js +0 -1
  175. package/dist/assets/identity-D4WOnl_h.js +0 -1
  176. package/dist/assets/index-lyyIVcc_.js +0 -304
  177. package/dist/assets/info-OMHHGYJF-C8_SHoRO.js +0 -1
  178. package/dist/assets/infoDiagram-42DDH7IO-BbvTdpSV.js +0 -2
  179. package/dist/assets/mermaid-parser.core-6Tn8epr_.js +0 -4
  180. package/dist/assets/packet-4T2RLAQJ-BvpAX0kJ.js +0 -1
  181. package/dist/assets/pie-ZZUOXDRM-Ow26Yf-E.js +0 -1
  182. package/dist/assets/radar-PYXPWWZC-e_ron5jQ.js +0 -1
  183. package/dist/assets/reduce-BDOBPIXr.js +0 -1
  184. package/dist/assets/stateDiagram-FHFEXIEX-CYfGMoR8.js +0 -1
  185. package/dist/assets/stateDiagram-v2-QKLJ7IA2-CO1W_n55.js +0 -1
  186. package/dist/assets/treeView-SZITEDCU-DsEr3xeq.js +0 -1
  187. package/dist/assets/treemap-W4RFUUIX-DV7nk2AB.js +0 -1
  188. package/dist/assets/vennDiagram-DHZGUBPP-BjTbuhcb.js +0 -34
  189. package/dist/assets/wardley-RL74JXVD-CrrFU9AE.js +0 -1
  190. /package/dist/assets/{chunk-4BX2VUAB-ean5NKtU.js → chunk-4BX2VUAB-C70mcfQR.js} +0 -0
  191. /package/dist/assets/{chunk-55IACEB6-CvSRyJqy.js → chunk-55IACEB6-CWfnqcLM.js} +0 -0
  192. /package/dist/assets/{chunk-BSJP7CBP-D8kBlJsf.js → chunk-BSJP7CBP-B0LrXV9y.js} +0 -0
  193. /package/dist/assets/{chunk-FMBD7UC4-DrNhFt1N.js → chunk-FMBD7UC4-_mV71Mwu.js} +0 -0
  194. /package/dist/assets/{chunk-QZHKN3VN-Csp3OYJY.js → chunk-QZHKN3VN-t2nrsegL.js} +0 -0
  195. /package/dist/assets/{katex-8mXVa4k3.js → katex-B2dtGfSp.js} +0 -0
  196. /package/dist/assets/{rough.esm-DtEqI08j.js → rough.esm-DEh6Frf9.js} +0 -0
@@ -1,6 +1,15 @@
1
1
  import { startTaskManagerServer } from "./index";
2
+ import {
3
+ parseBootstrapDevFlagFromArgv,
4
+ parseBootstrapPortFromArgv,
5
+ parseBootstrapProfileFromArgv,
6
+ } from "./parseBootstrapProfile";
7
+
8
+ // --dev flag explicitly sets dev runtime; without it, defaults to installed.
9
+ const isDev = parseBootstrapDevFlagFromArgv();
2
10
 
3
11
  await startTaskManagerServer({
4
- kind: "dev",
5
- profile: process.env.TASKMANAGER_PROFILE?.trim() || "dev",
12
+ kind: isDev ? "dev" : "installed",
13
+ profile: parseBootstrapProfileFromArgv(),
14
+ port: parseBootstrapPortFromArgv(),
6
15
  });
@@ -1,6 +1,11 @@
1
1
  import { startTaskManagerServer } from "./index";
2
+ import {
3
+ parseBootstrapPortFromArgv,
4
+ parseBootstrapProfileFromArgv,
5
+ } from "./parseBootstrapProfile";
2
6
 
3
7
  await startTaskManagerServer({
4
8
  kind: "installed",
5
- profile: process.env.TASKMANAGER_PROFILE?.trim() || undefined,
9
+ profile: parseBootstrapProfileFromArgv(),
10
+ port: parseBootstrapPortFromArgv(),
6
11
  });
@@ -8,6 +8,11 @@ import {
8
8
  setRuntimeConfigSelection,
9
9
  type RuntimeKind,
10
10
  } from "../shared/runtimeConfig";
11
+ import { resolveRuntimeSource } from "../shared/runtimeIdentity";
12
+ import {
13
+ buildLocalServerUrl,
14
+ type RunningServerStatus,
15
+ } from "../shared/serverStatus";
11
16
  import { authMiddleware, requireWebSession, type AppBindings } from "./auth";
12
17
  import { cliBoardReadError } from "./cliPolicyGuard";
13
18
  import { getDb, runMigrations } from "./db";
@@ -23,6 +28,20 @@ import { ensureDataDir, entryByIdOrSlug } from "./storage";
23
28
 
24
29
  export function createTaskManagerApp(kind: RuntimeKind): Hono<AppBindings> {
25
30
  const app = new Hono<AppBindings>();
31
+ const source = resolveRuntimeSource(import.meta.url);
32
+ // Keep `/api/health` and CLI `server status` on the exact same payload so
33
+ // users can compare them directly without translating field names.
34
+ const healthStatus = (): RunningServerStatus => {
35
+ const port = resolvePort({ kind });
36
+ return {
37
+ pid: process.pid,
38
+ port,
39
+ running: true,
40
+ runtime: kind,
41
+ source,
42
+ url: buildLocalServerUrl(port),
43
+ };
44
+ };
26
45
 
27
46
  // Keep dev auth close to production, but allow the Vite origin to talk to the
28
47
  // API directly for EventSource and fetch during local development.
@@ -37,7 +56,7 @@ export function createTaskManagerApp(kind: RuntimeKind): Hono<AppBindings> {
37
56
  }
38
57
 
39
58
  app.use("/api/*", authMiddleware);
40
- app.get("/api/health", (c) => c.json({ ok: true }));
59
+ app.get("/api/health", (c) => c.json(healthStatus()));
41
60
  app.get("/api/events", async (c) => {
42
61
  const rawBoardId = c.req.query("boardId");
43
62
  if (rawBoardId != null && !/^\d+$/.test(rawBoardId)) {
@@ -65,9 +84,10 @@ export function createTaskManagerApp(kind: RuntimeKind): Hono<AppBindings> {
65
84
  app.route("/api/notifications", notificationsRoute);
66
85
  app.route("/api/search", searchRoute);
67
86
 
68
- if (kind === "installed") {
69
- const distDir = resolveInstalledDistDir();
70
-
87
+ // Installed mode requires a built frontend; dev mode serves it as an
88
+ // optional fallback so the server URL is not a dead 404 if dist/ exists.
89
+ const distDir = resolveInstalledDistDir();
90
+ if (kind === "installed" || existsSync(path.join(distDir, "index.html"))) {
71
91
  app.use("/*", serveStatic({ root: distDir }));
72
92
 
73
93
  app.get("*", async () => {
@@ -100,10 +120,12 @@ function assertInstalledDistReady(): void {
100
120
  export async function startTaskManagerServer(options: {
101
121
  kind: RuntimeKind;
102
122
  profile?: string;
123
+ port?: number;
103
124
  }): Promise<ReturnType<typeof Bun.serve>> {
104
125
  setRuntimeConfigSelection({
105
126
  kind: options.kind,
106
127
  profile: options.profile,
128
+ port: options.port,
107
129
  });
108
130
 
109
131
  await ensureDataDir();
@@ -123,6 +145,7 @@ export async function startTaskManagerServer(options: {
123
145
  port: resolvePort({
124
146
  kind: options.kind,
125
147
  profile: options.profile,
148
+ port: options.port,
126
149
  }),
127
150
  fetch: app.fetch,
128
151
  // SSE keeps requests open by design, so raise the idle timeout above the
@@ -130,9 +153,12 @@ export async function startTaskManagerServer(options: {
130
153
  idleTimeout: 30,
131
154
  });
132
155
 
133
- console.log(
134
- `${options.kind === "installed" ? "TaskManager" : "TaskManager dev API"} server listening on http://localhost:${server.port}`,
135
- );
156
+ // Let the installed launcher print its own startup status so first-run output stays compact.
157
+ if (process.env.TASKMANAGER_SILENT_STARTUP_LOG !== "1") {
158
+ console.log(
159
+ `${options.kind === "installed" ? "TaskManager" : "TaskManager dev API"} server listening on http://localhost:${server.port}`,
160
+ );
161
+ }
136
162
 
137
163
  return server;
138
164
  }
@@ -18,10 +18,10 @@ ALTER TABLE task ADD COLUMN created_by_label TEXT;
18
18
 
19
19
  CREATE TABLE cli_global_policy (
20
20
  id INTEGER PRIMARY KEY CHECK (id = 1),
21
- create_board INTEGER NOT NULL DEFAULT 0
21
+ create_board INTEGER NOT NULL DEFAULT 1
22
22
  );
23
23
 
24
- INSERT INTO cli_global_policy (id, create_board) VALUES (1, 0);
24
+ INSERT INTO cli_global_policy (id, create_board) VALUES (1, 1);
25
25
 
26
26
  CREATE TABLE board_cli_policy (
27
27
  board_id INTEGER PRIMARY KEY REFERENCES board(id) ON DELETE CASCADE,
@@ -0,0 +1,14 @@
1
+ import type { Database } from "bun:sqlite";
2
+ import type { Migration } from "./types";
3
+
4
+ /**
5
+ * Default global CLI `create_board` is now on (migration 013 originally seeded off).
6
+ * Updates existing databases that already applied the old seed.
7
+ */
8
+ export const migration019: Migration = {
9
+ version: 19,
10
+ name: "019_cli_global_create_board_default_on",
11
+ up(db: Database): void {
12
+ db.run("UPDATE cli_global_policy SET create_board = 1 WHERE id = 1");
13
+ },
14
+ };
@@ -1,41 +1,43 @@
1
- import { migration001 } from "./001_initial";
2
- import { migration002 } from "./002_closed_at";
3
- import { migration003 } from "./003_task_search_fts5";
4
- import { migration004 } from "./004_task_search_extended";
5
- import { migration005 } from "./005_task_priorities";
6
- import { migration006 } from "./006_task_group_emoji";
7
- import { migration007 } from "./007_task_emoji";
8
- import { migration008 } from "./008_list_emoji";
9
- import { migration009 } from "./009_board_emoji";
10
- import { migration010 } from "./010_celebration_sounds_muted";
11
- import { migration011 } from "./011_board_cli_access";
12
- import { migration012 } from "./012_notification_event";
13
- import { migration013 } from "./013_cli_policy_and_provenance";
14
- import { migration014 } from "./014_drop_board_cli_access";
15
- import { migration015 } from "./015_trash_deleted_at";
16
- import { migration016 } from "./016_task_group_sort_and_board_defaults";
17
- import { migration017 } from "./017_task_priority_none_default";
18
- import { migration018 } from "./018_board_releases";
19
- import type { Migration } from "./types";
20
-
21
- /** Numbered migrations, ascending by version. */
22
- export const migrations: Migration[] = [
23
- migration001,
24
- migration002,
25
- migration003,
26
- migration004,
27
- migration005,
28
- migration006,
29
- migration007,
30
- migration008,
31
- migration009,
32
- migration010,
33
- migration011,
34
- migration012,
35
- migration013,
36
- migration014,
37
- migration015,
38
- migration016,
39
- migration017,
40
- migration018,
41
- ];
1
+ import { migration001 } from "./001_initial";
2
+ import { migration002 } from "./002_closed_at";
3
+ import { migration003 } from "./003_task_search_fts5";
4
+ import { migration004 } from "./004_task_search_extended";
5
+ import { migration005 } from "./005_task_priorities";
6
+ import { migration006 } from "./006_task_group_emoji";
7
+ import { migration007 } from "./007_task_emoji";
8
+ import { migration008 } from "./008_list_emoji";
9
+ import { migration009 } from "./009_board_emoji";
10
+ import { migration010 } from "./010_celebration_sounds_muted";
11
+ import { migration011 } from "./011_board_cli_access";
12
+ import { migration012 } from "./012_notification_event";
13
+ import { migration013 } from "./013_cli_policy_and_provenance";
14
+ import { migration014 } from "./014_drop_board_cli_access";
15
+ import { migration015 } from "./015_trash_deleted_at";
16
+ import { migration016 } from "./016_task_group_sort_and_board_defaults";
17
+ import { migration017 } from "./017_task_priority_none_default";
18
+ import { migration018 } from "./018_board_releases";
19
+ import { migration019 } from "./019_cli_global_create_board_default_on";
20
+ import type { Migration } from "./types";
21
+
22
+ /** Numbered migrations, ascending by version. */
23
+ export const migrations: Migration[] = [
24
+ migration001,
25
+ migration002,
26
+ migration003,
27
+ migration004,
28
+ migration005,
29
+ migration006,
30
+ migration007,
31
+ migration008,
32
+ migration009,
33
+ migration010,
34
+ migration011,
35
+ migration012,
36
+ migration013,
37
+ migration014,
38
+ migration015,
39
+ migration016,
40
+ migration017,
41
+ migration018,
42
+ migration019,
43
+ ];
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Reads `--profile <name>` from argv for server bootstrap entrypoints.
3
+ * Parent CLIs pass the resolved profile this way instead of any profile env var.
4
+ */
5
+ export function parseBootstrapProfileFromArgv(): string | undefined {
6
+ const argv = process.argv.slice(2);
7
+ const i = argv.indexOf("--profile");
8
+ if (i >= 0) {
9
+ const next = argv[i + 1]?.trim();
10
+ if (next) return next;
11
+ }
12
+ const eq = argv.find((a) => a.startsWith("--profile="));
13
+ if (eq) {
14
+ const v = eq.slice("--profile=".length).trim();
15
+ if (v) return v;
16
+ }
17
+ return undefined;
18
+ }
19
+
20
+ /** Reads `--port <n>` from argv for server bootstrap entrypoints (no port env var). */
21
+ export function parseBootstrapPortFromArgv(): number | undefined {
22
+ const argv = process.argv.slice(2);
23
+ const i = argv.indexOf("--port");
24
+ if (i >= 0) {
25
+ const next = argv[i + 1]?.trim();
26
+ if (next) {
27
+ const parsed = Number(next);
28
+ if (Number.isInteger(parsed) && parsed > 0) return parsed;
29
+ }
30
+ }
31
+ const eq = argv.find((a) => a.startsWith("--port="));
32
+ if (eq) {
33
+ const parsed = Number(eq.slice("--port=".length).trim());
34
+ if (Number.isInteger(parsed) && parsed > 0) return parsed;
35
+ }
36
+ return undefined;
37
+ }
38
+
39
+ /** Reads `--dev` flag from argv for server bootstrap entrypoints. */
40
+ export function parseBootstrapDevFlagFromArgv(): boolean {
41
+ return process.argv.slice(2).includes("--dev");
42
+ }
@@ -61,7 +61,8 @@ export function readCliGlobalPolicy(): CliGlobalPolicy {
61
61
  const row = db
62
62
  .query("SELECT create_board FROM cli_global_policy WHERE id = 1")
63
63
  .get() as { create_board: number } | null;
64
- return { createBoard: row ? row.create_board !== 0 : false };
64
+ // Missing row should not happen after migrations; default matches seeded `create_board` (on).
65
+ return { createBoard: row ? row.create_board !== 0 : true };
65
66
  }
66
67
 
67
68
  export function setCliGlobalCreateBoard(enabled: boolean): void {