@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.
- package/README.md +1 -1
- package/dist/assets/architecture-YZFGNWBL-DoE0KxgG.js +1 -0
- package/dist/assets/architectureDiagram-Q4EWVU46-DeuBhy7X.js +36 -0
- package/dist/assets/{blockDiagram-DXYQGD6D-DQzEOPT2.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-C2e-_49I.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-AZq3s1Dh.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-B1-M78qu.js → chunk-67CJDMHE-BMYAVZfw.js} +1 -1
- package/dist/assets/{chunk-7N4EOEYR-D7mYFpz-.js → chunk-7N4EOEYR-Ct-EY7Nc.js} +1 -1
- package/dist/assets/{chunk-AA7GKIK3-VWI9k39i.js → chunk-AA7GKIK3-Bd4HFpeo.js} +1 -1
- package/dist/assets/{chunk-CIAEETIT-hnu4zamm.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-BJsh9nO9.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-BLIPdXaZ.js → chunk-K5T4RW27-ALKIf000.js} +5 -5
- package/dist/assets/{chunk-KGLVRYIC-DvaW2TkT.js → chunk-KGLVRYIC-Bg6HNTZ-.js} +1 -1
- package/dist/assets/{chunk-LIHQZDEY-CUsM0M11.js → chunk-LIHQZDEY-DeyGongE.js} +1 -1
- package/dist/assets/{chunk-ORNJ4GCN-CfluNV0_.js → chunk-ORNJ4GCN-Bx83s1bJ.js} +1 -1
- package/dist/assets/{chunk-OYMX7WX6-CkWzw4JX.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-lveZDhBf.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-dx09stuy.js → erDiagram-SMLLAGMA-Cf7Xtd9A.js} +2 -2
- package/dist/assets/{flatten-B2BZ0pzY.js → flatten-CYX_pHZ7.js} +1 -1
- package/dist/assets/{flowDiagram-DWJPFMVM-CJi2WISS.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-Bjj94M12.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-BpzHnKdP.css +1 -0
- package/dist/assets/index-DmNErTAP.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-Cnc1bwBo.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-CwHbIze0.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-DswAJiEd.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-DgQTCddl.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-D1moa23Z.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-Dvhj7HGn.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-z-IncVmK.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-D-kouujI.js → wardleyDiagram-NUSXRM2D-5Q201ea3.js} +1 -1
- package/dist/assets/{xychartDiagram-5P7HB3ND-D1lnM0pL.js → xychartDiagram-5P7HB3ND-BPZv_axd.js} +3 -3
- package/dist/index.html +17 -13
- package/package.json +2 -4
- package/skills/hiro-task-manager-cli/SKILL.md +6 -4
- package/skills/hiro-task-manager-cli/reference/cli-access-policy.md +1 -0
- package/skills/hiro-task-manager-cli/reference/releases.md +14 -0
- package/src/cli/bootstrap/launcher.ts +19 -5
- package/src/cli/bootstrap/program.test.ts +46 -0
- package/src/cli/bootstrap/program.ts +50 -1
- package/src/cli/commands/query.ts +56 -56
- package/src/cli/commands/releases.ts +22 -0
- package/src/cli/handlers/boards.test.ts +669 -669
- package/src/cli/handlers/cli-wiring.test.ts +38 -1
- package/src/cli/handlers/releases.ts +15 -0
- package/src/cli/handlers/search.test.ts +374 -374
- package/src/cli/handlers/search.ts +17 -17
- package/src/cli/lib/cli-http-errors.test.ts +85 -85
- package/src/cli/lib/launcherUi.test.ts +74 -0
- package/src/cli/lib/launcherUi.ts +47 -0
- package/src/cli/lib/write/releases.ts +64 -1
- package/src/cli/lib/write-result.test.ts +3 -0
- package/src/cli/lib/write-result.ts +3 -0
- package/src/cli/lib/writeCommands.breadth.test.ts +143 -0
- package/src/cli/lib/writeCommands.ts +1 -0
- package/src/cli/subprocess.real-stack.test.ts +625 -611
- package/src/cli/subprocess.smoke.test.ts +954 -954
- package/src/client/api/useBoardChangeStream.ts +421 -168
- package/src/client/api/useBoardIndexStream.ts +35 -0
- 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/layout/AppShell.tsx +5 -2
- package/src/client/components/layout/NotificationToasts.tsx +38 -1
- 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/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/client/store/notificationUi.ts +14 -0
- package/src/server/auth.ts +351 -351
- package/src/server/events.ts +31 -4
- package/src/server/migrations/registry.ts +43 -43
- package/src/server/notificationEvents.ts +8 -1
- package/src/server/routes/boards.ts +15 -1
- package/src/server/routes/trash.ts +6 -1
- package/src/shared/boardEvents.ts +6 -0
- package/src/shared/runtimeConfig.ts +256 -256
- package/src/shared/skillsInstall.ts +2 -3
- package/dist/assets/architecture-YZFGNWBL-C1MoQeSs.js +0 -1
- package/dist/assets/architectureDiagram-Q4EWVU46-DUEfvDBu.js +0 -36
- package/dist/assets/channel-yBmN_ln0.js +0 -1
- package/dist/assets/classDiagram-6PBFFD2Q-Dx_f-9b7.js +0 -1
- package/dist/assets/classDiagram-v2-HSJHXN6E-CSfvZ-nt.js +0 -1
- package/dist/assets/clone-CXokakwV.js +0 -1
- package/dist/assets/cytoscape.esm-BIYWHPG0.js +0 -321
- package/dist/assets/dagre-Do0eD9eI.js +0 -1
- package/dist/assets/diagram-5BDNPKRD-Dq5yM_uY.js +0 -10
- package/dist/assets/diagram-G4DWMVQ6-D-SYOmKm.js +0 -24
- package/dist/assets/diagram-MMDJMWI5-lU5t9BZA.js +0 -43
- package/dist/assets/diagram-TYMM5635-6tfUbY3R.js +0 -24
- package/dist/assets/gitGraph-7Q5UKJZL-BXTuQaDM.js +0 -1
- package/dist/assets/graphlib-BIlXYGdM.js +0 -1
- package/dist/assets/identity-D4WOnl_h.js +0 -1
- package/dist/assets/index-CZZuue3D.js +0 -304
- package/dist/assets/index-hMFTu7sr.css +0 -1
- package/dist/assets/info-OMHHGYJF-BeeKt8-X.js +0 -1
- package/dist/assets/infoDiagram-42DDH7IO-wq_opQKO.js +0 -2
- package/dist/assets/mermaid-parser.core-DrLhKJ48.js +0 -4
- package/dist/assets/packet-4T2RLAQJ-DQ-H9_jd.js +0 -1
- package/dist/assets/pie-ZZUOXDRM-BSj0Jsyj.js +0 -1
- package/dist/assets/radar-PYXPWWZC-B7-oRPFL.js +0 -1
- package/dist/assets/reduce-Uumu9GdR.js +0 -1
- package/dist/assets/stateDiagram-FHFEXIEX-Dx5CjenB.js +0 -1
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-C_PkrTdc.js +0 -1
- package/dist/assets/treeView-SZITEDCU-CFXle9Az.js +0 -1
- package/dist/assets/treemap-W4RFUUIX-CAW3vWh8.js +0 -1
- package/dist/assets/vennDiagram-DHZGUBPP-CT1ehozU.js +0 -34
- package/dist/assets/wardley-RL74JXVD-7q3ju4kc.js +0 -1
- package/scripts/postinstall-message.mjs +0 -160
- /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
|
@@ -1,256 +1,256 @@
|
|
|
1
|
-
import {
|
|
2
|
-
existsSync,
|
|
3
|
-
mkdirSync,
|
|
4
|
-
readdirSync,
|
|
5
|
-
readFileSync,
|
|
6
|
-
writeFileSync,
|
|
7
|
-
} from "node:fs";
|
|
8
|
-
import path from "node:path";
|
|
9
|
-
|
|
10
|
-
export type RuntimeKind = "installed" | "dev";
|
|
11
|
-
|
|
12
|
-
export interface RuntimeConfigFile {
|
|
13
|
-
api_key?: string;
|
|
14
|
-
port?: number;
|
|
15
|
-
data_dir?: string;
|
|
16
|
-
auth_dir?: string;
|
|
17
|
-
open_browser?: boolean;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface RuntimeConfigOverrides {
|
|
21
|
-
kind?: RuntimeKind;
|
|
22
|
-
profile?: string;
|
|
23
|
-
port?: number;
|
|
24
|
-
dataDir?: string;
|
|
25
|
-
authDir?: string;
|
|
26
|
-
openBrowser?: boolean;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
let selectedRuntimeKind: RuntimeKind | undefined;
|
|
30
|
-
let selectedProfileName: string | undefined;
|
|
31
|
-
/** Set from global `hirotm --port` (parsed before Commander); not read from any env var. */
|
|
32
|
-
let selectedCliPort: number | undefined;
|
|
33
|
-
|
|
34
|
-
function normalizeProfileName(profile: string | undefined): string | undefined {
|
|
35
|
-
const trimmed = profile?.trim();
|
|
36
|
-
return trimmed ? trimmed : undefined;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function readRuntimeKindFromEnv(): RuntimeKind | undefined {
|
|
40
|
-
const value = process.env.TASKMANAGER_RUNTIME?.trim().toLowerCase();
|
|
41
|
-
if (value === "installed" || value === "dev") return value;
|
|
42
|
-
return undefined;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function resolveHomeDir(): string {
|
|
46
|
-
return process.env.HOME ?? process.env.USERPROFILE ?? process.cwd();
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function normalizePort(value: unknown): number | undefined {
|
|
50
|
-
if (typeof value === "number" && Number.isInteger(value) && value > 0) {
|
|
51
|
-
return value;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
if (typeof value === "string" && value.trim()) {
|
|
55
|
-
const parsed = Number(value);
|
|
56
|
-
if (Number.isInteger(parsed) && parsed > 0) return parsed;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return undefined;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function normalizeBoolean(value: unknown): boolean | undefined {
|
|
63
|
-
if (typeof value === "boolean") return value;
|
|
64
|
-
if (typeof value === "string") {
|
|
65
|
-
const normalized = value.trim().toLowerCase();
|
|
66
|
-
if (normalized === "true" || normalized === "1") return true;
|
|
67
|
-
if (normalized === "false" || normalized === "0") return false;
|
|
68
|
-
}
|
|
69
|
-
return undefined;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export function setRuntimeConfigSelection(selection: {
|
|
73
|
-
kind?: RuntimeKind;
|
|
74
|
-
profile?: string;
|
|
75
|
-
port?: number;
|
|
76
|
-
}): void {
|
|
77
|
-
if (selection.kind) selectedRuntimeKind = selection.kind;
|
|
78
|
-
if (selection.profile !== undefined) {
|
|
79
|
-
selectedProfileName = normalizeProfileName(selection.profile);
|
|
80
|
-
}
|
|
81
|
-
if (selection.port !== undefined) {
|
|
82
|
-
const p = normalizePort(selection.port);
|
|
83
|
-
selectedCliPort = p;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// Runtime kind is set explicitly via --dev flag, setRuntimeConfigSelection, or
|
|
88
|
-
// TASKMANAGER_RUNTIME env. Profile name no longer implies runtime kind.
|
|
89
|
-
export function resolveRuntimeKind(overrides: RuntimeConfigOverrides = {}): RuntimeKind {
|
|
90
|
-
return (
|
|
91
|
-
overrides.kind ??
|
|
92
|
-
selectedRuntimeKind ??
|
|
93
|
-
readRuntimeKindFromEnv() ??
|
|
94
|
-
"installed"
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
export function resolveProfileName(overrides: RuntimeConfigOverrides = {}): string {
|
|
99
|
-
return (
|
|
100
|
-
normalizeProfileName(overrides.profile) ??
|
|
101
|
-
selectedProfileName ??
|
|
102
|
-
"default"
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
export function getTaskManagerHomeDir(): string {
|
|
107
|
-
return path.join(resolveHomeDir(), ".taskmanager");
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/** True if any `~/.taskmanager/profiles/<name>/config.json` exists (any named profile). */
|
|
111
|
-
export function hasAnyProfileConfigOnDisk(): boolean {
|
|
112
|
-
const profilesRoot = path.join(getTaskManagerHomeDir(), "profiles");
|
|
113
|
-
if (!existsSync(profilesRoot)) return false;
|
|
114
|
-
try {
|
|
115
|
-
for (const ent of readdirSync(profilesRoot, { withFileTypes: true })) {
|
|
116
|
-
if (!ent.isDirectory()) continue;
|
|
117
|
-
if (existsSync(path.join(profilesRoot, ent.name, "config.json"))) {
|
|
118
|
-
return true;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
} catch {
|
|
122
|
-
return false;
|
|
123
|
-
}
|
|
124
|
-
return false;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
export function getProfileRootDir(overrides: RuntimeConfigOverrides = {}): string {
|
|
128
|
-
return path.join(getTaskManagerHomeDir(), "profiles", resolveProfileName(overrides));
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export function ensureProfileRootDir(overrides: RuntimeConfigOverrides = {}): string {
|
|
132
|
-
const profileRootDir = getProfileRootDir(overrides);
|
|
133
|
-
mkdirSync(profileRootDir, { recursive: true });
|
|
134
|
-
return profileRootDir;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
export function ensureRuntimeDirectories(
|
|
138
|
-
overrides: RuntimeConfigOverrides = {},
|
|
139
|
-
): {
|
|
140
|
-
profileRootDir: string;
|
|
141
|
-
dataDir: string;
|
|
142
|
-
authDir: string;
|
|
143
|
-
} {
|
|
144
|
-
const profileRootDir = ensureProfileRootDir(overrides);
|
|
145
|
-
const dataDir = resolveDataDir(overrides);
|
|
146
|
-
const authDir = resolveAuthDir(overrides);
|
|
147
|
-
|
|
148
|
-
mkdirSync(dataDir, { recursive: true });
|
|
149
|
-
mkdirSync(authDir, { recursive: true });
|
|
150
|
-
|
|
151
|
-
return {
|
|
152
|
-
profileRootDir,
|
|
153
|
-
dataDir,
|
|
154
|
-
authDir,
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
export function getProfileConfigFilePath(overrides: RuntimeConfigOverrides = {}): string {
|
|
159
|
-
return path.join(getProfileRootDir(overrides), "config.json");
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
export function hasProfileConfigFile(overrides: RuntimeConfigOverrides = {}): boolean {
|
|
163
|
-
return existsSync(getProfileConfigFilePath(overrides));
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
export function readProfileConfig(
|
|
167
|
-
overrides: RuntimeConfigOverrides = {},
|
|
168
|
-
): RuntimeConfigFile {
|
|
169
|
-
const configFilePath = getProfileConfigFilePath(overrides);
|
|
170
|
-
if (!existsSync(configFilePath)) return {};
|
|
171
|
-
|
|
172
|
-
try {
|
|
173
|
-
const raw = readFileSync(configFilePath, "utf8").trim();
|
|
174
|
-
if (!raw) return {};
|
|
175
|
-
return JSON.parse(raw) as RuntimeConfigFile;
|
|
176
|
-
} catch {
|
|
177
|
-
return {};
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
export function writeProfileConfig(
|
|
182
|
-
config: RuntimeConfigFile,
|
|
183
|
-
overrides: RuntimeConfigOverrides = {},
|
|
184
|
-
): string {
|
|
185
|
-
const configFilePath = path.join(ensureProfileRootDir(overrides), "config.json");
|
|
186
|
-
writeFileSync(configFilePath, `${JSON.stringify(config, null, 2)}\n`, "utf8");
|
|
187
|
-
return configFilePath;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
export function getDefaultPort(overrides: RuntimeConfigOverrides = {}): number {
|
|
191
|
-
return resolveRuntimeKind(overrides) === "dev" ? 3002 : 3001;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// All profiles (including dev) use the profile-based data dir under
|
|
195
|
-
// ~/.taskmanager/profiles/<name>/data. Use --data-dir or config.json
|
|
196
|
-
// data_dir to override.
|
|
197
|
-
export function getDefaultDataDir(overrides: RuntimeConfigOverrides = {}): string {
|
|
198
|
-
return path.join(getProfileRootDir(overrides), "data");
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
export function getDefaultAuthDir(overrides: RuntimeConfigOverrides = {}): string {
|
|
202
|
-
return path.join(getProfileRootDir(overrides), "auth");
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
export function getServerPidFilePath(overrides: RuntimeConfigOverrides = {}): string {
|
|
206
|
-
return path.join(getProfileRootDir(overrides), "server.pid.json");
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
export function resolvePort(overrides: RuntimeConfigOverrides = {}): number {
|
|
210
|
-
const config = readProfileConfig(overrides);
|
|
211
|
-
return (
|
|
212
|
-
normalizePort(overrides.port) ??
|
|
213
|
-
normalizePort(selectedCliPort) ??
|
|
214
|
-
normalizePort(config.port) ??
|
|
215
|
-
getDefaultPort(overrides)
|
|
216
|
-
);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
export function resolveDataDir(overrides: RuntimeConfigOverrides = {}): string {
|
|
220
|
-
const config = readProfileConfig(overrides);
|
|
221
|
-
return path.resolve(
|
|
222
|
-
overrides.dataDir ??
|
|
223
|
-
process.env.TASKMANAGER_DATA_DIR ??
|
|
224
|
-
config.data_dir ??
|
|
225
|
-
getDefaultDataDir(overrides),
|
|
226
|
-
);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
export function resolveAuthDir(overrides: RuntimeConfigOverrides = {}): string {
|
|
230
|
-
const config = readProfileConfig(overrides);
|
|
231
|
-
return path.resolve(
|
|
232
|
-
overrides.authDir ??
|
|
233
|
-
process.env.TASKMANAGER_AUTH_DIR ??
|
|
234
|
-
config.auth_dir ??
|
|
235
|
-
getDefaultAuthDir(overrides),
|
|
236
|
-
);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
export function resolveOpenBrowser(overrides: RuntimeConfigOverrides = {}): boolean {
|
|
240
|
-
const config = readProfileConfig(overrides);
|
|
241
|
-
return (
|
|
242
|
-
normalizeBoolean(overrides.openBrowser) ??
|
|
243
|
-
normalizeBoolean(process.env.TASKMANAGER_OPEN_BROWSER) ??
|
|
244
|
-
normalizeBoolean(config.open_browser) ??
|
|
245
|
-
true
|
|
246
|
-
);
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
export function resolveApiKey(overrides: RuntimeConfigOverrides = {}): string | undefined {
|
|
250
|
-
const config = readProfileConfig(overrides);
|
|
251
|
-
|
|
252
|
-
if (process.env.API_KEY?.trim()) return process.env.API_KEY;
|
|
253
|
-
if (config.api_key?.trim()) return config.api_key;
|
|
254
|
-
|
|
255
|
-
return undefined;
|
|
256
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
existsSync,
|
|
3
|
+
mkdirSync,
|
|
4
|
+
readdirSync,
|
|
5
|
+
readFileSync,
|
|
6
|
+
writeFileSync,
|
|
7
|
+
} from "node:fs";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
|
|
10
|
+
export type RuntimeKind = "installed" | "dev";
|
|
11
|
+
|
|
12
|
+
export interface RuntimeConfigFile {
|
|
13
|
+
api_key?: string;
|
|
14
|
+
port?: number;
|
|
15
|
+
data_dir?: string;
|
|
16
|
+
auth_dir?: string;
|
|
17
|
+
open_browser?: boolean;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface RuntimeConfigOverrides {
|
|
21
|
+
kind?: RuntimeKind;
|
|
22
|
+
profile?: string;
|
|
23
|
+
port?: number;
|
|
24
|
+
dataDir?: string;
|
|
25
|
+
authDir?: string;
|
|
26
|
+
openBrowser?: boolean;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let selectedRuntimeKind: RuntimeKind | undefined;
|
|
30
|
+
let selectedProfileName: string | undefined;
|
|
31
|
+
/** Set from global `hirotm --port` (parsed before Commander); not read from any env var. */
|
|
32
|
+
let selectedCliPort: number | undefined;
|
|
33
|
+
|
|
34
|
+
function normalizeProfileName(profile: string | undefined): string | undefined {
|
|
35
|
+
const trimmed = profile?.trim();
|
|
36
|
+
return trimmed ? trimmed : undefined;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function readRuntimeKindFromEnv(): RuntimeKind | undefined {
|
|
40
|
+
const value = process.env.TASKMANAGER_RUNTIME?.trim().toLowerCase();
|
|
41
|
+
if (value === "installed" || value === "dev") return value;
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function resolveHomeDir(): string {
|
|
46
|
+
return process.env.HOME ?? process.env.USERPROFILE ?? process.cwd();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function normalizePort(value: unknown): number | undefined {
|
|
50
|
+
if (typeof value === "number" && Number.isInteger(value) && value > 0) {
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (typeof value === "string" && value.trim()) {
|
|
55
|
+
const parsed = Number(value);
|
|
56
|
+
if (Number.isInteger(parsed) && parsed > 0) return parsed;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function normalizeBoolean(value: unknown): boolean | undefined {
|
|
63
|
+
if (typeof value === "boolean") return value;
|
|
64
|
+
if (typeof value === "string") {
|
|
65
|
+
const normalized = value.trim().toLowerCase();
|
|
66
|
+
if (normalized === "true" || normalized === "1") return true;
|
|
67
|
+
if (normalized === "false" || normalized === "0") return false;
|
|
68
|
+
}
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function setRuntimeConfigSelection(selection: {
|
|
73
|
+
kind?: RuntimeKind;
|
|
74
|
+
profile?: string;
|
|
75
|
+
port?: number;
|
|
76
|
+
}): void {
|
|
77
|
+
if (selection.kind) selectedRuntimeKind = selection.kind;
|
|
78
|
+
if (selection.profile !== undefined) {
|
|
79
|
+
selectedProfileName = normalizeProfileName(selection.profile);
|
|
80
|
+
}
|
|
81
|
+
if (selection.port !== undefined) {
|
|
82
|
+
const p = normalizePort(selection.port);
|
|
83
|
+
selectedCliPort = p;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Runtime kind is set explicitly via --dev flag, setRuntimeConfigSelection, or
|
|
88
|
+
// TASKMANAGER_RUNTIME env. Profile name no longer implies runtime kind.
|
|
89
|
+
export function resolveRuntimeKind(overrides: RuntimeConfigOverrides = {}): RuntimeKind {
|
|
90
|
+
return (
|
|
91
|
+
overrides.kind ??
|
|
92
|
+
selectedRuntimeKind ??
|
|
93
|
+
readRuntimeKindFromEnv() ??
|
|
94
|
+
"installed"
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function resolveProfileName(overrides: RuntimeConfigOverrides = {}): string {
|
|
99
|
+
return (
|
|
100
|
+
normalizeProfileName(overrides.profile) ??
|
|
101
|
+
selectedProfileName ??
|
|
102
|
+
"default"
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function getTaskManagerHomeDir(): string {
|
|
107
|
+
return path.join(resolveHomeDir(), ".taskmanager");
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** True if any `~/.taskmanager/profiles/<name>/config.json` exists (any named profile). */
|
|
111
|
+
export function hasAnyProfileConfigOnDisk(): boolean {
|
|
112
|
+
const profilesRoot = path.join(getTaskManagerHomeDir(), "profiles");
|
|
113
|
+
if (!existsSync(profilesRoot)) return false;
|
|
114
|
+
try {
|
|
115
|
+
for (const ent of readdirSync(profilesRoot, { withFileTypes: true })) {
|
|
116
|
+
if (!ent.isDirectory()) continue;
|
|
117
|
+
if (existsSync(path.join(profilesRoot, ent.name, "config.json"))) {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
} catch {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function getProfileRootDir(overrides: RuntimeConfigOverrides = {}): string {
|
|
128
|
+
return path.join(getTaskManagerHomeDir(), "profiles", resolveProfileName(overrides));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export function ensureProfileRootDir(overrides: RuntimeConfigOverrides = {}): string {
|
|
132
|
+
const profileRootDir = getProfileRootDir(overrides);
|
|
133
|
+
mkdirSync(profileRootDir, { recursive: true });
|
|
134
|
+
return profileRootDir;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export function ensureRuntimeDirectories(
|
|
138
|
+
overrides: RuntimeConfigOverrides = {},
|
|
139
|
+
): {
|
|
140
|
+
profileRootDir: string;
|
|
141
|
+
dataDir: string;
|
|
142
|
+
authDir: string;
|
|
143
|
+
} {
|
|
144
|
+
const profileRootDir = ensureProfileRootDir(overrides);
|
|
145
|
+
const dataDir = resolveDataDir(overrides);
|
|
146
|
+
const authDir = resolveAuthDir(overrides);
|
|
147
|
+
|
|
148
|
+
mkdirSync(dataDir, { recursive: true });
|
|
149
|
+
mkdirSync(authDir, { recursive: true });
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
profileRootDir,
|
|
153
|
+
dataDir,
|
|
154
|
+
authDir,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export function getProfileConfigFilePath(overrides: RuntimeConfigOverrides = {}): string {
|
|
159
|
+
return path.join(getProfileRootDir(overrides), "config.json");
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export function hasProfileConfigFile(overrides: RuntimeConfigOverrides = {}): boolean {
|
|
163
|
+
return existsSync(getProfileConfigFilePath(overrides));
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export function readProfileConfig(
|
|
167
|
+
overrides: RuntimeConfigOverrides = {},
|
|
168
|
+
): RuntimeConfigFile {
|
|
169
|
+
const configFilePath = getProfileConfigFilePath(overrides);
|
|
170
|
+
if (!existsSync(configFilePath)) return {};
|
|
171
|
+
|
|
172
|
+
try {
|
|
173
|
+
const raw = readFileSync(configFilePath, "utf8").trim();
|
|
174
|
+
if (!raw) return {};
|
|
175
|
+
return JSON.parse(raw) as RuntimeConfigFile;
|
|
176
|
+
} catch {
|
|
177
|
+
return {};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export function writeProfileConfig(
|
|
182
|
+
config: RuntimeConfigFile,
|
|
183
|
+
overrides: RuntimeConfigOverrides = {},
|
|
184
|
+
): string {
|
|
185
|
+
const configFilePath = path.join(ensureProfileRootDir(overrides), "config.json");
|
|
186
|
+
writeFileSync(configFilePath, `${JSON.stringify(config, null, 2)}\n`, "utf8");
|
|
187
|
+
return configFilePath;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export function getDefaultPort(overrides: RuntimeConfigOverrides = {}): number {
|
|
191
|
+
return resolveRuntimeKind(overrides) === "dev" ? 3002 : 3001;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// All profiles (including dev) use the profile-based data dir under
|
|
195
|
+
// ~/.taskmanager/profiles/<name>/data. Use --data-dir or config.json
|
|
196
|
+
// data_dir to override.
|
|
197
|
+
export function getDefaultDataDir(overrides: RuntimeConfigOverrides = {}): string {
|
|
198
|
+
return path.join(getProfileRootDir(overrides), "data");
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export function getDefaultAuthDir(overrides: RuntimeConfigOverrides = {}): string {
|
|
202
|
+
return path.join(getProfileRootDir(overrides), "auth");
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export function getServerPidFilePath(overrides: RuntimeConfigOverrides = {}): string {
|
|
206
|
+
return path.join(getProfileRootDir(overrides), "server.pid.json");
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export function resolvePort(overrides: RuntimeConfigOverrides = {}): number {
|
|
210
|
+
const config = readProfileConfig(overrides);
|
|
211
|
+
return (
|
|
212
|
+
normalizePort(overrides.port) ??
|
|
213
|
+
normalizePort(selectedCliPort) ??
|
|
214
|
+
normalizePort(config.port) ??
|
|
215
|
+
getDefaultPort(overrides)
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export function resolveDataDir(overrides: RuntimeConfigOverrides = {}): string {
|
|
220
|
+
const config = readProfileConfig(overrides);
|
|
221
|
+
return path.resolve(
|
|
222
|
+
overrides.dataDir ??
|
|
223
|
+
process.env.TASKMANAGER_DATA_DIR ??
|
|
224
|
+
config.data_dir ??
|
|
225
|
+
getDefaultDataDir(overrides),
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export function resolveAuthDir(overrides: RuntimeConfigOverrides = {}): string {
|
|
230
|
+
const config = readProfileConfig(overrides);
|
|
231
|
+
return path.resolve(
|
|
232
|
+
overrides.authDir ??
|
|
233
|
+
process.env.TASKMANAGER_AUTH_DIR ??
|
|
234
|
+
config.auth_dir ??
|
|
235
|
+
getDefaultAuthDir(overrides),
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export function resolveOpenBrowser(overrides: RuntimeConfigOverrides = {}): boolean {
|
|
240
|
+
const config = readProfileConfig(overrides);
|
|
241
|
+
return (
|
|
242
|
+
normalizeBoolean(overrides.openBrowser) ??
|
|
243
|
+
normalizeBoolean(process.env.TASKMANAGER_OPEN_BROWSER) ??
|
|
244
|
+
normalizeBoolean(config.open_browser) ??
|
|
245
|
+
true
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export function resolveApiKey(overrides: RuntimeConfigOverrides = {}): string | undefined {
|
|
250
|
+
const config = readProfileConfig(overrides);
|
|
251
|
+
|
|
252
|
+
if (process.env.API_KEY?.trim()) return process.env.API_KEY;
|
|
253
|
+
if (config.api_key?.trim()) return config.api_key;
|
|
254
|
+
|
|
255
|
+
return undefined;
|
|
256
|
+
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Copies bundled skills/ from the installed package into ~/.taskmanager/skills/.
|
|
3
|
-
* Used
|
|
4
|
-
* --ignore-scripts, CI).
|
|
5
|
-
* plain-Node logic that runs at npm/bun install time.
|
|
3
|
+
* Used by the launcher because package-manager lifecycle scripts may be blocked
|
|
4
|
+
* or skipped entirely (trusted-package checks, --ignore-scripts, CI).
|
|
6
5
|
*/
|
|
7
6
|
import {
|
|
8
7
|
cpSync,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./chunk-K5T4RW27-BLIPdXaZ.js";import{n as e}from"./chunk-7N4EOEYR-D7mYFpz-.js";export{e as createArchitectureServices};
|