@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.
- package/LICENSE +21 -0
- package/README.md +41 -52
- package/dist/assets/architecture-YZFGNWBL-DoE0KxgG.js +1 -0
- package/dist/assets/architectureDiagram-Q4EWVU46-DeuBhy7X.js +36 -0
- package/dist/assets/{blockDiagram-DXYQGD6D-DfOGNphI.js → blockDiagram-DXYQGD6D-BDBy9ns9.js} +1 -1
- package/dist/assets/{c4Diagram-AHTNJAMY-B2Yfcwbo.js → c4Diagram-AHTNJAMY-CpqJj_8a.js} +1 -1
- package/dist/assets/channel-PHRyjspt.js +1 -0
- package/dist/assets/{chunk-2KRD3SAO-9yt00aGC.js → chunk-2KRD3SAO-DEpUsxdZ.js} +1 -1
- package/dist/assets/chunk-336JU56O-BGQvSwLk.js +2 -0
- package/dist/assets/chunk-426QAEUC-Cl9nQN9c.js +1 -0
- package/dist/assets/{chunk-4TB4RGXK-DF8yJBFl.js → chunk-4TB4RGXK-Dq7aiIrZ.js} +2 -2
- package/dist/assets/{chunk-5FUZZQ4R-XEga0hMC.js → chunk-5FUZZQ4R-B_HuuUjf.js} +1 -1
- package/dist/assets/{chunk-5PVQY5BW-BrmXs2Gs.js → chunk-5PVQY5BW-cGfZCZGU.js} +2 -2
- package/dist/assets/{chunk-67CJDMHE-5wFKo04G.js → chunk-67CJDMHE-BMYAVZfw.js} +1 -1
- package/dist/assets/{chunk-7N4EOEYR-BRRGX_NC.js → chunk-7N4EOEYR-Ct-EY7Nc.js} +1 -1
- package/dist/assets/{chunk-AA7GKIK3-DUZv_pNI.js → chunk-AA7GKIK3-Bd4HFpeo.js} +1 -1
- package/dist/assets/{chunk-CIAEETIT-mA5aM_d7.js → chunk-CIAEETIT-CrFUkPMT.js} +1 -1
- package/dist/assets/{chunk-EDXVE4YY-DxUqDyxy.js → chunk-EDXVE4YY-DMDyt0NF.js} +1 -1
- package/dist/assets/{chunk-ENJZ2VHE-BgZKYo1l.js → chunk-ENJZ2VHE-DrWzOrpd.js} +1 -1
- package/dist/assets/{chunk-FOC6F5B3-B-cqGCPC.js → chunk-FOC6F5B3-Bemzq96j.js} +1 -1
- package/dist/assets/{chunk-ICPOFSXX-BNR1V8rT.js → chunk-ICPOFSXX-DkUVjrLw.js} +5 -5
- package/dist/assets/{chunk-K5T4RW27-BLRDzioh.js → chunk-K5T4RW27-ALKIf000.js} +5 -5
- package/dist/assets/{chunk-KGLVRYIC-CTkQSeKy.js → chunk-KGLVRYIC-Bg6HNTZ-.js} +1 -1
- package/dist/assets/{chunk-LIHQZDEY-Cf34Nu3J.js → chunk-LIHQZDEY-DeyGongE.js} +1 -1
- package/dist/assets/{chunk-ORNJ4GCN-D3uXgbay.js → chunk-ORNJ4GCN-Bx83s1bJ.js} +1 -1
- package/dist/assets/{chunk-OYMX7WX6-syQho5jf.js → chunk-OYMX7WX6-BqRUtRpL.js} +1 -1
- package/dist/assets/{chunk-U2HBQHQK-DTJPeU7W.js → chunk-U2HBQHQK-DogcerR6.js} +1 -1
- package/dist/assets/{chunk-X2U36JSP-CrTnmMqG.js → chunk-X2U36JSP-CwVWdmZV.js} +1 -1
- package/dist/assets/chunk-XPW4576I-DQpNCogT.js +32 -0
- package/dist/assets/{chunk-YZCP3GAM-9wq0QKUn.js → chunk-YZCP3GAM-crQSbji9.js} +1 -1
- package/dist/assets/{chunk-ZZ45TVLE-D3I1kLlo.js → chunk-ZZ45TVLE-Bk1S1YtS.js} +1 -1
- package/dist/assets/classDiagram-6PBFFD2Q-B_TabGaU.js +1 -0
- package/dist/assets/classDiagram-v2-HSJHXN6E-CGnZkUWw.js +1 -0
- package/dist/assets/clone-D4ka472w.js +1 -0
- package/dist/assets/{cose-bilkent-S5V4N54A-BygGvZGW.js → cose-bilkent-S5V4N54A-RBTHUit8.js} +1 -1
- package/dist/assets/cytoscape.esm-BGJwlmkf.js +321 -0
- package/dist/assets/dagre-B32eYLtm.js +1 -0
- package/dist/assets/{dagre-KV5264BT-BBqulDtd.js → dagre-KV5264BT-nX7tuXXn.js} +1 -1
- package/dist/assets/diagram-5BDNPKRD-DRxMXlQr.js +10 -0
- package/dist/assets/diagram-G4DWMVQ6-CoojevGm.js +24 -0
- package/dist/assets/diagram-MMDJMWI5-CWtJyfVW.js +43 -0
- package/dist/assets/diagram-TYMM5635-CsDJC4Hq.js +24 -0
- package/dist/assets/{erDiagram-SMLLAGMA-BN5eJerP.js → erDiagram-SMLLAGMA-Cf7Xtd9A.js} +2 -2
- package/dist/assets/{flatten-C5NL-f24.js → flatten-CYX_pHZ7.js} +1 -1
- package/dist/assets/{flowDiagram-DWJPFMVM-CbFskc8S.js → flowDiagram-DWJPFMVM-DQaeR16a.js} +3 -3
- package/dist/assets/{ganttDiagram-T4ZO3ILL-OCTvbRxF.js → ganttDiagram-T4ZO3ILL-8EIcztcH.js} +1 -1
- package/dist/assets/gitGraph-7Q5UKJZL-BH9A1SAZ.js +1 -0
- package/dist/assets/{gitGraphDiagram-UUTBAWPF-wpqI2kyI.js → gitGraphDiagram-UUTBAWPF-DO9ODqYw.js} +1 -1
- package/dist/assets/graphlib-bPBqlJKT.js +1 -0
- package/dist/assets/identity-Me9aart9.js +1 -0
- package/dist/assets/index-oKG1C41_.js +273 -0
- package/dist/assets/info-OMHHGYJF-BvKR-zWh.js +1 -0
- package/dist/assets/infoDiagram-42DDH7IO-pRTXCm5C.js +2 -0
- package/dist/assets/isEmpty-Cu0k-j1j.js +1 -0
- package/dist/assets/{ishikawaDiagram-UXIWVN3A-Epc23N_0.js → ishikawaDiagram-UXIWVN3A-BP2YE5QI.js} +2 -2
- package/dist/assets/{journeyDiagram-VCZTEJTY-BkMxoaPq.js → journeyDiagram-VCZTEJTY-B3l2juoL.js} +1 -1
- package/dist/assets/{kanban-definition-6JOO6SKY-C8dW_26n.js → kanban-definition-6JOO6SKY-BpIpEOZZ.js} +4 -4
- package/dist/assets/{line-DNzQATGr.js → line-otOkzGl8.js} +1 -1
- package/dist/assets/mermaid-parser.core-xWsW24Gq.js +4 -0
- package/dist/assets/{mindmap-definition-QFDTVHPH-CvpNtrKT.js → mindmap-definition-QFDTVHPH-B9khyC7X.js} +3 -3
- package/dist/assets/packet-4T2RLAQJ-D8Dw3nmf.js +1 -0
- package/dist/assets/pie-ZZUOXDRM-ZghowlAE.js +1 -0
- package/dist/assets/{pieDiagram-DEJITSTG-eENymoXZ.js → pieDiagram-DEJITSTG-v32hL3i7.js} +1 -1
- package/dist/assets/{quadrantDiagram-34T5L4WZ-c0iZxo2I.js → quadrantDiagram-34T5L4WZ-DIL3GDFt.js} +1 -1
- package/dist/assets/radar-PYXPWWZC-D-PK3JOd.js +1 -0
- package/dist/assets/reduce-CImcgAcU.js +1 -0
- package/dist/assets/{requirementDiagram-MS252O5E-CmRO3hLp.js → requirementDiagram-MS252O5E-D8os2-4y.js} +2 -2
- package/dist/assets/{sankeyDiagram-XADWPNL6-woJZoQ58.js → sankeyDiagram-XADWPNL6-BV70D4l5.js} +1 -1
- package/dist/assets/{sequenceDiagram-FGHM5R23-B7qNcwNo.js → sequenceDiagram-FGHM5R23-Cwu8hQW1.js} +1 -1
- package/dist/assets/stateDiagram-FHFEXIEX-oYUWv7Fb.js +1 -0
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-CFUTpFu-.js +1 -0
- package/dist/assets/{timeline-definition-GMOUNBTQ-CQWqDPGG.js → timeline-definition-GMOUNBTQ-CxSdKxpL.js} +1 -1
- package/dist/assets/treeView-SZITEDCU-uVgaJQzG.js +1 -0
- package/dist/assets/treemap-W4RFUUIX-Dcad_9AN.js +1 -0
- package/dist/assets/vennDiagram-DHZGUBPP-D4wgD7QI.js +34 -0
- package/dist/assets/wardley-RL74JXVD-CFXrK8mx.js +1 -0
- package/dist/assets/{wardleyDiagram-NUSXRM2D-DNhPIFCg.js → wardleyDiagram-NUSXRM2D-5Q201ea3.js} +1 -1
- package/dist/assets/{xychartDiagram-5P7HB3ND-BDblAZ11.js → xychartDiagram-5P7HB3ND-BPZv_axd.js} +3 -3
- package/dist/index.html +16 -12
- package/package.json +99 -92
- package/scripts/stubs/node-domexception/index.cjs +18 -0
- package/scripts/stubs/node-domexception/package.json +7 -0
- package/skills/hiro-task-manager-cli/SKILL.md +97 -0
- package/skills/hiro-task-manager-cli/reference/boards.md +143 -0
- package/skills/hiro-task-manager-cli/reference/cli-access-policy.md +72 -0
- package/skills/hiro-task-manager-cli/reference/errors.md +85 -0
- package/skills/hiro-task-manager-cli/reference/lists.md +106 -0
- package/skills/hiro-task-manager-cli/reference/releases.md +87 -0
- package/skills/hiro-task-manager-cli/reference/search.md +38 -0
- package/skills/hiro-task-manager-cli/reference/statuses.md +25 -0
- package/skills/hiro-task-manager-cli/reference/tasks.md +144 -0
- package/skills/hiro-task-manager-cli/reference/trash.md +50 -0
- package/src/cli/bootstrap/launcher.test.ts +66 -0
- package/src/cli/bootstrap/launcher.ts +389 -35
- package/src/cli/bootstrap/program.test.ts +46 -0
- package/src/cli/bootstrap/program.ts +54 -1
- package/src/cli/bootstrap/runtime.test.ts +15 -0
- package/src/cli/bootstrap/runtime.ts +27 -1
- package/src/cli/commands/query.ts +56 -56
- package/src/cli/commands/server.ts +27 -19
- package/src/cli/handlers/boards.test.ts +669 -669
- package/src/cli/handlers/cli-wiring.test.ts +1 -1
- package/src/cli/handlers/search.test.ts +374 -374
- package/src/cli/handlers/search.ts +17 -17
- package/src/cli/handlers/server.test.ts +55 -13
- package/src/cli/handlers/server.ts +16 -3
- package/src/cli/lib/api-client.test.ts +35 -2
- package/src/cli/lib/api-client.ts +43 -10
- package/src/cli/lib/cli-http-errors.test.ts +85 -85
- package/src/cli/lib/command-helpers.ts +161 -154
- package/src/cli/lib/config.ts +4 -0
- package/src/cli/lib/launcherUi.test.ts +74 -0
- package/src/cli/lib/launcherUi.ts +213 -0
- package/src/cli/lib/process.test.ts +24 -5
- package/src/cli/lib/process.ts +86 -55
- package/src/cli/ports/process.ts +8 -2
- package/src/cli/subprocess.real-stack.test.ts +611 -598
- package/src/cli/subprocess.smoke.test.ts +954 -969
- package/src/cli/types/config.ts +2 -6
- package/src/client/components/auth/AuthScreen.tsx +3 -3
- package/src/client/components/board/BoardStatsChips.tsx +233 -233
- package/src/client/components/board/BoardStatsContext.tsx +41 -41
- package/src/client/components/board/boardHeaderButtonStyles.ts +38 -38
- package/src/client/components/board/shortcuts/useBoardShortcutKeydown.ts +49 -49
- package/src/client/components/board/useBoardCanvasPanScroll.ts +108 -108
- package/src/client/components/board/useBoardTaskContainerDroppableReact.ts +33 -33
- package/src/client/components/board/useBoardTaskSortableReact.ts +26 -26
- package/src/client/components/multi-select.tsx +1206 -1206
- package/src/client/components/routing/BoardPage.tsx +20 -20
- package/src/client/components/routing/NavigationRegistrar.tsx +13 -13
- package/src/client/components/settings/SettingsPage.tsx +1 -1
- package/src/client/components/task/TaskCard.tsx +643 -643
- package/src/client/components/ui/badge.tsx +49 -49
- package/src/client/components/ui/button.tsx +65 -65
- package/src/client/components/ui/command.tsx +193 -193
- package/src/client/components/ui/dialog.tsx +163 -163
- package/src/client/components/ui/input-group.tsx +155 -155
- package/src/client/components/ui/input.tsx +19 -19
- package/src/client/components/ui/popover.tsx +87 -87
- package/src/client/components/ui/separator.tsx +28 -28
- package/src/client/components/ui/textarea.tsx +18 -18
- package/src/client/index.css +248 -248
- package/src/client/lib/appNavigate.ts +16 -16
- package/src/client/lib/taskCardDate.ts +111 -111
- package/src/client/lib/utils.ts +6 -6
- package/src/server/auth.ts +351 -302
- package/src/server/bootstrapDev.ts +11 -2
- package/src/server/bootstrapInstalled.ts +6 -1
- package/src/server/index.ts +33 -7
- package/src/server/migrations/013_cli_policy_and_provenance.ts +2 -2
- package/src/server/migrations/019_cli_global_create_board_default_on.ts +14 -0
- package/src/server/migrations/registry.ts +43 -41
- package/src/server/parseBootstrapProfile.ts +42 -0
- package/src/server/storage/cliPolicy.ts +2 -1
- package/src/shared/runtimeConfig.ts +256 -237
- package/src/shared/runtimeIdentity.test.ts +47 -0
- package/src/shared/runtimeIdentity.ts +35 -0
- package/src/shared/serverStatus.ts +21 -0
- package/src/shared/skillsInstall.ts +70 -0
- package/src/shared/terminalColors.ts +24 -0
- package/dist/assets/architecture-YZFGNWBL-3h1eIYfB.js +0 -1
- package/dist/assets/architectureDiagram-Q4EWVU46-DSQ1_74_.js +0 -36
- package/dist/assets/channel-yBmN_ln0.js +0 -1
- package/dist/assets/classDiagram-6PBFFD2Q-CotFZI8-.js +0 -1
- package/dist/assets/classDiagram-v2-HSJHXN6E-DAPzeDGn.js +0 -1
- package/dist/assets/clone-BRQpYu_n.js +0 -1
- package/dist/assets/cytoscape.esm-BIYWHPG0.js +0 -321
- package/dist/assets/dagre-rhyPjnsQ.js +0 -1
- package/dist/assets/diagram-5BDNPKRD-Ky3EXXj0.js +0 -10
- package/dist/assets/diagram-G4DWMVQ6-t7LbT0Uz.js +0 -24
- package/dist/assets/diagram-MMDJMWI5-CdnLXEMx.js +0 -43
- package/dist/assets/diagram-TYMM5635-CnzTqJBM.js +0 -24
- package/dist/assets/gitGraph-7Q5UKJZL-CG8f8JF7.js +0 -1
- package/dist/assets/graphlib-COiJG5Qv.js +0 -1
- package/dist/assets/identity-D4WOnl_h.js +0 -1
- package/dist/assets/index-lyyIVcc_.js +0 -304
- package/dist/assets/info-OMHHGYJF-C8_SHoRO.js +0 -1
- package/dist/assets/infoDiagram-42DDH7IO-BbvTdpSV.js +0 -2
- package/dist/assets/mermaid-parser.core-6Tn8epr_.js +0 -4
- package/dist/assets/packet-4T2RLAQJ-BvpAX0kJ.js +0 -1
- package/dist/assets/pie-ZZUOXDRM-Ow26Yf-E.js +0 -1
- package/dist/assets/radar-PYXPWWZC-e_ron5jQ.js +0 -1
- package/dist/assets/reduce-BDOBPIXr.js +0 -1
- package/dist/assets/stateDiagram-FHFEXIEX-CYfGMoR8.js +0 -1
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-CO1W_n55.js +0 -1
- package/dist/assets/treeView-SZITEDCU-DsEr3xeq.js +0 -1
- package/dist/assets/treemap-W4RFUUIX-DV7nk2AB.js +0 -1
- package/dist/assets/vennDiagram-DHZGUBPP-BjTbuhcb.js +0 -34
- package/dist/assets/wardley-RL74JXVD-CrrFU9AE.js +0 -1
- /package/dist/assets/{chunk-4BX2VUAB-ean5NKtU.js → chunk-4BX2VUAB-C70mcfQR.js} +0 -0
- /package/dist/assets/{chunk-55IACEB6-CvSRyJqy.js → chunk-55IACEB6-CWfnqcLM.js} +0 -0
- /package/dist/assets/{chunk-BSJP7CBP-D8kBlJsf.js → chunk-BSJP7CBP-B0LrXV9y.js} +0 -0
- /package/dist/assets/{chunk-FMBD7UC4-DrNhFt1N.js → chunk-FMBD7UC4-_mV71Mwu.js} +0 -0
- /package/dist/assets/{chunk-QZHKN3VN-Csp3OYJY.js → chunk-QZHKN3VN-t2nrsegL.js} +0 -0
- /package/dist/assets/{katex-8mXVa4k3.js → katex-B2dtGfSp.js} +0 -0
- /package/dist/assets/{rough.esm-DtEqI08j.js → rough.esm-DEh6Frf9.js} +0 -0
|
@@ -52,7 +52,14 @@ describe("process.ts server lifecycle (mock fetch)", () => {
|
|
|
52
52
|
setMockFetch(async (input: RequestInfo | URL) => {
|
|
53
53
|
const url = typeof input === "string" ? input : (input as Request).url;
|
|
54
54
|
expect(url).toContain("/api/health");
|
|
55
|
-
return new Response(JSON.stringify({
|
|
55
|
+
return new Response(JSON.stringify({
|
|
56
|
+
pid: 1001,
|
|
57
|
+
port: 17_001,
|
|
58
|
+
running: true,
|
|
59
|
+
runtime: "installed",
|
|
60
|
+
source: "installed",
|
|
61
|
+
url: "http://127.0.0.1:17001",
|
|
62
|
+
}), {
|
|
56
63
|
status: 200,
|
|
57
64
|
headers: { "content-type": "application/json" },
|
|
58
65
|
});
|
|
@@ -60,15 +67,18 @@ describe("process.ts server lifecycle (mock fetch)", () => {
|
|
|
60
67
|
|
|
61
68
|
const status = await readServerStatus({ port: 17_001 });
|
|
62
69
|
expect(status).toEqual({
|
|
70
|
+
pid: 1001,
|
|
63
71
|
running: true,
|
|
64
72
|
port: 17_001,
|
|
73
|
+
runtime: "installed",
|
|
74
|
+
source: "installed",
|
|
65
75
|
url: "http://127.0.0.1:17001",
|
|
66
76
|
});
|
|
67
77
|
});
|
|
68
78
|
|
|
69
79
|
test("readServerStatus — no health, no pid file", async () => {
|
|
70
80
|
setMockFetch(async () =>
|
|
71
|
-
new Response(JSON.stringify({
|
|
81
|
+
new Response(JSON.stringify({ running: false }), {
|
|
72
82
|
status: 200,
|
|
73
83
|
headers: { "content-type": "application/json" },
|
|
74
84
|
}),
|
|
@@ -93,7 +103,7 @@ describe("process.ts server lifecycle (mock fetch)", () => {
|
|
|
93
103
|
expect(existsSync(pidPath)).toBe(true);
|
|
94
104
|
|
|
95
105
|
setMockFetch(async () =>
|
|
96
|
-
new Response(JSON.stringify({
|
|
106
|
+
new Response(JSON.stringify({ running: false }), {
|
|
97
107
|
status: 200,
|
|
98
108
|
headers: { "content-type": "application/json" },
|
|
99
109
|
}),
|
|
@@ -120,16 +130,25 @@ describe("process.ts server lifecycle (mock fetch)", () => {
|
|
|
120
130
|
setMockFetch(async (input: RequestInfo | URL) => {
|
|
121
131
|
const url = typeof input === "string" ? input : (input as Request).url;
|
|
122
132
|
expect(url).toContain("/api/health");
|
|
123
|
-
return new Response(JSON.stringify({
|
|
133
|
+
return new Response(JSON.stringify({
|
|
134
|
+
pid: process.pid,
|
|
135
|
+
port,
|
|
136
|
+
running: true,
|
|
137
|
+
runtime: "dev",
|
|
138
|
+
source: "repo",
|
|
139
|
+
url: `http://127.0.0.1:${port}`,
|
|
140
|
+
}), {
|
|
124
141
|
status: 200,
|
|
125
142
|
headers: { "content-type": "application/json" },
|
|
126
143
|
});
|
|
127
144
|
});
|
|
128
145
|
|
|
129
146
|
const status = await readServerStatus({ port });
|
|
130
|
-
|
|
147
|
+
if (!status.running) expect.unreachable();
|
|
131
148
|
expect(status.port).toBe(port);
|
|
132
149
|
expect(status.pid).toBe(process.pid);
|
|
150
|
+
expect(status.runtime).toBe("dev");
|
|
151
|
+
expect(status.source).toBe("repo");
|
|
133
152
|
expect(status.url).toBe(`http://127.0.0.1:${port}`);
|
|
134
153
|
});
|
|
135
154
|
|
package/src/cli/lib/process.ts
CHANGED
|
@@ -7,6 +7,12 @@ import {
|
|
|
7
7
|
} from "node:fs";
|
|
8
8
|
import path from "node:path";
|
|
9
9
|
import { fileURLToPath } from "node:url";
|
|
10
|
+
import { resolveRuntimeSource } from "../../shared/runtimeIdentity";
|
|
11
|
+
import {
|
|
12
|
+
buildLocalServerUrl,
|
|
13
|
+
type RunningServerStatus,
|
|
14
|
+
type ServerStatus,
|
|
15
|
+
} from "../../shared/serverStatus";
|
|
10
16
|
import {
|
|
11
17
|
getServerPidFilePath,
|
|
12
18
|
resolveDataDir,
|
|
@@ -15,11 +21,11 @@ import {
|
|
|
15
21
|
resolveRuntimeKind,
|
|
16
22
|
type ConfigOverrides,
|
|
17
23
|
} from "./config";
|
|
18
|
-
import { fetchHealth } from "./api-client";
|
|
24
|
+
import { fetchHealth, fetchHealthStatus } from "./api-client";
|
|
19
25
|
import { CLI_DEFAULTS, CLI_POLLING } from "./constants";
|
|
20
26
|
import { CLI_ERR } from "../types/errors";
|
|
21
|
-
import type { ServerStatus } from "../types/config";
|
|
22
27
|
import { CliError } from "./output";
|
|
28
|
+
import type { ServerStartMode } from "../ports/process";
|
|
23
29
|
|
|
24
30
|
interface ManagedServerRecord {
|
|
25
31
|
pid: number;
|
|
@@ -29,7 +35,11 @@ interface ManagedServerRecord {
|
|
|
29
35
|
|
|
30
36
|
export type { ServerStatus };
|
|
31
37
|
|
|
32
|
-
type ServerReadyCallback = (status:
|
|
38
|
+
type ServerReadyCallback = (status: RunningServerStatus) => void | Promise<void>;
|
|
39
|
+
|
|
40
|
+
function buildStoppedStatus(): ServerStatus {
|
|
41
|
+
return { running: false };
|
|
42
|
+
}
|
|
33
43
|
|
|
34
44
|
function getPidFilePath(overrides: ConfigOverrides = {}): string {
|
|
35
45
|
return getServerPidFilePath(overrides);
|
|
@@ -94,9 +104,8 @@ function buildServerEnv(overrides: ConfigOverrides): NodeJS.ProcessEnv {
|
|
|
94
104
|
const env: NodeJS.ProcessEnv = {
|
|
95
105
|
...process.env,
|
|
96
106
|
TASKMANAGER_RUNTIME: resolveRuntimeKind(overrides),
|
|
97
|
-
TASKMANAGER_PROFILE: resolveProfileName(overrides),
|
|
98
|
-
TASKMANAGER_PORT: String(overrides.port),
|
|
99
107
|
};
|
|
108
|
+
delete env.TASKMANAGER_PORT;
|
|
100
109
|
|
|
101
110
|
// Pass the resolved data directory explicitly so the child process uses the
|
|
102
111
|
// same profile-aware runtime config as the parent command.
|
|
@@ -108,26 +117,15 @@ function buildServerEnv(overrides: ConfigOverrides): NodeJS.ProcessEnv {
|
|
|
108
117
|
export async function readServerStatus(
|
|
109
118
|
overrides: ConfigOverrides = {},
|
|
110
119
|
): Promise<ServerStatus> {
|
|
111
|
-
const
|
|
112
|
-
const healthy =
|
|
120
|
+
const health = await fetchHealthStatus(overrides);
|
|
121
|
+
const healthy = health?.running === true;
|
|
113
122
|
const managedRecord = readManagedServerRecord(overrides);
|
|
114
123
|
|
|
115
124
|
if (healthy) {
|
|
116
125
|
if (managedRecord && !isProcessAlive(managedRecord.pid)) {
|
|
117
126
|
removeManagedServerRecord(overrides);
|
|
118
|
-
return {
|
|
119
|
-
port,
|
|
120
|
-
running: true,
|
|
121
|
-
url: `http://127.0.0.1:${port}`,
|
|
122
|
-
};
|
|
123
127
|
}
|
|
124
|
-
|
|
125
|
-
return {
|
|
126
|
-
pid: managedRecord?.pid,
|
|
127
|
-
port,
|
|
128
|
-
running: true,
|
|
129
|
-
url: `http://127.0.0.1:${port}`,
|
|
130
|
-
};
|
|
128
|
+
return health;
|
|
131
129
|
}
|
|
132
130
|
|
|
133
131
|
if (managedRecord && !isProcessAlive(managedRecord.pid)) {
|
|
@@ -139,7 +137,7 @@ export async function readServerStatus(
|
|
|
139
137
|
|
|
140
138
|
export async function startServer(
|
|
141
139
|
overrides: ConfigOverrides = {},
|
|
142
|
-
|
|
140
|
+
mode: ServerStartMode = "foreground",
|
|
143
141
|
onReady?: ServerReadyCallback,
|
|
144
142
|
): Promise<ServerStatus> {
|
|
145
143
|
const port = overrides.port;
|
|
@@ -153,17 +151,36 @@ export async function startServer(
|
|
|
153
151
|
return currentStatus;
|
|
154
152
|
}
|
|
155
153
|
|
|
154
|
+
const resolvedPort = resolvePort({ ...overrides, port: overrides.port });
|
|
155
|
+
const runDetached = mode !== "foreground";
|
|
156
|
+
const silenceConsole = mode === "background";
|
|
157
|
+
const runtime = resolveRuntimeKind(overrides);
|
|
158
|
+
const source = resolveRuntimeSource(import.meta.url);
|
|
159
|
+
const spawnCmd = [
|
|
160
|
+
process.execPath,
|
|
161
|
+
getServerEntryPath(overrides),
|
|
162
|
+
"--profile",
|
|
163
|
+
resolveProfileName(overrides),
|
|
164
|
+
"--port",
|
|
165
|
+
String(resolvedPort),
|
|
166
|
+
];
|
|
167
|
+
// Pass --dev explicitly so the child bootstrap sets dev runtime.
|
|
168
|
+
if (runtime === "dev") {
|
|
169
|
+
spawnCmd.push("--dev");
|
|
170
|
+
}
|
|
156
171
|
const child = Bun.spawn({
|
|
157
|
-
cmd:
|
|
172
|
+
cmd: spawnCmd,
|
|
158
173
|
cwd: process.cwd(),
|
|
159
|
-
detached:
|
|
174
|
+
detached: runDetached,
|
|
160
175
|
env: buildServerEnv({ ...overrides, port }),
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
176
|
+
// First-run launcher mode keeps the server alive after the launcher exits,
|
|
177
|
+
// but still lets the recovery key print in the same terminal.
|
|
178
|
+
stderr: silenceConsole ? "ignore" : "inherit",
|
|
179
|
+
stdin: runDetached ? "ignore" : "inherit",
|
|
180
|
+
stdout: silenceConsole ? "ignore" : "inherit",
|
|
164
181
|
});
|
|
165
182
|
|
|
166
|
-
if (
|
|
183
|
+
if (runDetached) {
|
|
167
184
|
child.unref();
|
|
168
185
|
|
|
169
186
|
const healthy = await waitForHealth(port, CLI_DEFAULTS.SERVER_START_WAIT_MS);
|
|
@@ -171,18 +188,24 @@ export async function startServer(
|
|
|
171
188
|
throw new CliError("Server failed to start", 7, {
|
|
172
189
|
code: CLI_ERR.serverStartTimeout,
|
|
173
190
|
retryable: true,
|
|
174
|
-
hint: "Try running `hirotm server start
|
|
191
|
+
hint: "Try running `hirotm server start --foreground` to inspect logs.",
|
|
175
192
|
url: `http://127.0.0.1:${port}`,
|
|
176
193
|
});
|
|
177
194
|
}
|
|
178
195
|
|
|
196
|
+
const health = await fetchHealthStatus({ ...overrides, port });
|
|
197
|
+
|
|
179
198
|
if (onReady) {
|
|
180
|
-
await onReady(
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
199
|
+
await onReady(
|
|
200
|
+
health ?? {
|
|
201
|
+
pid: child.pid,
|
|
202
|
+
port,
|
|
203
|
+
running: true,
|
|
204
|
+
runtime,
|
|
205
|
+
source,
|
|
206
|
+
url: buildLocalServerUrl(port),
|
|
207
|
+
},
|
|
208
|
+
);
|
|
186
209
|
}
|
|
187
210
|
|
|
188
211
|
// Persist the pid so later status calls can report a CLI-managed background server.
|
|
@@ -192,12 +215,16 @@ export async function startServer(
|
|
|
192
215
|
startedAt: new Date().toISOString(),
|
|
193
216
|
}, overrides);
|
|
194
217
|
|
|
195
|
-
return
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
218
|
+
return (
|
|
219
|
+
health ?? {
|
|
220
|
+
pid: child.pid,
|
|
221
|
+
port,
|
|
222
|
+
running: true,
|
|
223
|
+
runtime,
|
|
224
|
+
source,
|
|
225
|
+
url: buildLocalServerUrl(port),
|
|
226
|
+
}
|
|
227
|
+
);
|
|
201
228
|
}
|
|
202
229
|
|
|
203
230
|
// Wait for health before handing control back to the launcher so first-run
|
|
@@ -213,16 +240,27 @@ export async function startServer(
|
|
|
213
240
|
});
|
|
214
241
|
}
|
|
215
242
|
|
|
243
|
+
const health = await fetchHealthStatus({ ...overrides, port });
|
|
244
|
+
|
|
216
245
|
if (onReady) {
|
|
217
|
-
await onReady(
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
246
|
+
await onReady(
|
|
247
|
+
health ?? {
|
|
248
|
+
pid: child.pid,
|
|
249
|
+
port,
|
|
250
|
+
running: true,
|
|
251
|
+
runtime,
|
|
252
|
+
source,
|
|
253
|
+
url: buildLocalServerUrl(port),
|
|
254
|
+
},
|
|
255
|
+
);
|
|
223
256
|
}
|
|
224
257
|
|
|
258
|
+
// Track whether the CLI forwarded a termination signal so we can treat
|
|
259
|
+
// the resulting non-zero exit code as a normal user-initiated shutdown
|
|
260
|
+
// rather than an unexpected crash.
|
|
261
|
+
let signalForwarded = false;
|
|
225
262
|
const forwardSignal = (signal: NodeJS.Signals) => {
|
|
263
|
+
signalForwarded = true;
|
|
226
264
|
child.kill(signal);
|
|
227
265
|
};
|
|
228
266
|
|
|
@@ -233,17 +271,14 @@ export async function startServer(
|
|
|
233
271
|
process.off("SIGINT", forwardSignal);
|
|
234
272
|
process.off("SIGTERM", forwardSignal);
|
|
235
273
|
|
|
236
|
-
if (exitCode !== 0) {
|
|
274
|
+
if (exitCode !== 0 && !signalForwarded) {
|
|
237
275
|
throw new CliError("Server exited unexpectedly", 1, {
|
|
238
276
|
code: CLI_ERR.serverExited,
|
|
239
277
|
childExitCode: exitCode,
|
|
240
278
|
});
|
|
241
279
|
}
|
|
242
280
|
|
|
243
|
-
return
|
|
244
|
-
port,
|
|
245
|
-
running: false,
|
|
246
|
-
};
|
|
281
|
+
return buildStoppedStatus();
|
|
247
282
|
}
|
|
248
283
|
|
|
249
284
|
/**
|
|
@@ -312,9 +347,5 @@ export async function stopServer(
|
|
|
312
347
|
|
|
313
348
|
removeManagedServerRecord(overrides);
|
|
314
349
|
|
|
315
|
-
return
|
|
316
|
-
pid: record.pid,
|
|
317
|
-
port: waitPort,
|
|
318
|
-
running: false,
|
|
319
|
-
};
|
|
350
|
+
return buildStoppedStatus();
|
|
320
351
|
}
|
package/src/cli/ports/process.ts
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
|
+
import type { RunningServerStatus } from "../../shared/serverStatus";
|
|
1
2
|
import type { ConfigOverrides, ServerStatus } from "../types/config";
|
|
2
3
|
|
|
3
4
|
export type ServerReadyCallback = (
|
|
4
|
-
status:
|
|
5
|
+
status: RunningServerStatus,
|
|
5
6
|
) => void | Promise<void>;
|
|
6
7
|
|
|
8
|
+
export type ServerStartMode =
|
|
9
|
+
| "foreground"
|
|
10
|
+
| "background"
|
|
11
|
+
| "background-attached";
|
|
12
|
+
|
|
7
13
|
/**
|
|
8
14
|
* Local process lifecycle for `hirotm server` (spawn, pid file, health polling).
|
|
9
15
|
* Implemented by `adapters/node-process.ts` (delegates to `lib/process.ts`).
|
|
@@ -14,7 +20,7 @@ export type ProcessPort = {
|
|
|
14
20
|
) => Promise<ServerStatus>;
|
|
15
21
|
startServer: (
|
|
16
22
|
overrides?: ConfigOverrides,
|
|
17
|
-
|
|
23
|
+
mode?: ServerStartMode,
|
|
18
24
|
onReady?: ServerReadyCallback,
|
|
19
25
|
) => Promise<ServerStatus>;
|
|
20
26
|
stopServer: (overrides?: ConfigOverrides) => Promise<ServerStatus>;
|