amaran-light-cli 1.0.2
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 +22 -0
- package/README.md +374 -0
- package/dist/__tests__/autoCct.test.d.ts +2 -0
- package/dist/__tests__/autoCct.test.d.ts.map +1 -0
- package/dist/__tests__/autoCct.test.js +65 -0
- package/dist/__tests__/autoCct.test.js.map +1 -0
- package/dist/__tests__/cctUtil.test.d.ts +2 -0
- package/dist/__tests__/cctUtil.test.d.ts.map +1 -0
- package/dist/__tests__/cctUtil.test.js +195 -0
- package/dist/__tests__/cctUtil.test.js.map +1 -0
- package/dist/__tests__/cli.smoke.test.d.ts +2 -0
- package/dist/__tests__/cli.smoke.test.d.ts.map +1 -0
- package/dist/__tests__/cli.smoke.test.js +18 -0
- package/dist/__tests__/cli.smoke.test.js.map +1 -0
- package/dist/__tests__/intensityApi.test.d.ts +2 -0
- package/dist/__tests__/intensityApi.test.d.ts.map +1 -0
- package/dist/__tests__/intensityApi.test.js +105 -0
- package/dist/__tests__/intensityApi.test.js.map +1 -0
- package/dist/__tests__/lightControl.test.d.ts +2 -0
- package/dist/__tests__/lightControl.test.d.ts.map +1 -0
- package/dist/__tests__/lightControl.test.js +185 -0
- package/dist/__tests__/lightControl.test.js.map +1 -0
- package/dist/cctUtil.d.ts +26 -0
- package/dist/cctUtil.d.ts.map +1 -0
- package/dist/cctUtil.js +93 -0
- package/dist/cctUtil.js.map +1 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +274 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/autoCct.d.ts +5 -0
- package/dist/commands/autoCct.d.ts.map +1 -0
- package/dist/commands/autoCct.js +270 -0
- package/dist/commands/autoCct.js.map +1 -0
- package/dist/commands/cct.d.ts +5 -0
- package/dist/commands/cct.d.ts.map +1 -0
- package/dist/commands/cct.js +68 -0
- package/dist/commands/cct.js.map +1 -0
- package/dist/commands/color.d.ts +5 -0
- package/dist/commands/color.d.ts.map +1 -0
- package/dist/commands/color.js +63 -0
- package/dist/commands/color.js.map +1 -0
- package/dist/commands/discover.d.ts +5 -0
- package/dist/commands/discover.d.ts.map +1 -0
- package/dist/commands/discover.js +30 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/hsi.d.ts +5 -0
- package/dist/commands/hsi.d.ts.map +1 -0
- package/dist/commands/hsi.js +65 -0
- package/dist/commands/hsi.js.map +1 -0
- package/dist/commands/intensity.d.ts +5 -0
- package/dist/commands/intensity.d.ts.map +1 -0
- package/dist/commands/intensity.js +56 -0
- package/dist/commands/intensity.js.map +1 -0
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +36 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/power.d.ts +5 -0
- package/dist/commands/power.d.ts.map +1 -0
- package/dist/commands/power.js +126 -0
- package/dist/commands/power.js.map +1 -0
- package/dist/commands/schedule.d.ts +5 -0
- package/dist/commands/schedule.d.ts.map +1 -0
- package/dist/commands/schedule.js +188 -0
- package/dist/commands/schedule.js.map +1 -0
- package/dist/commands/service.d.ts +5 -0
- package/dist/commands/service.d.ts.map +1 -0
- package/dist/commands/service.js +350 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +54 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands.d.ts +5 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +31 -0
- package/dist/commands.js.map +1 -0
- package/dist/discovery.d.ts +13 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +130 -0
- package/dist/discovery.js.map +1 -0
- package/dist/geoipUtil.d.ts +8 -0
- package/dist/geoipUtil.d.ts.map +1 -0
- package/dist/geoipUtil.js +26 -0
- package/dist/geoipUtil.js.map +1 -0
- package/dist/lightControl.d.ts +114 -0
- package/dist/lightControl.d.ts.map +1 -0
- package/dist/lightControl.js +385 -0
- package/dist/lightControl.js.map +1 -0
- package/dist/types.d.ts +37 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +75 -0
- package/scripts/create-launchd-service.sh +114 -0
- package/scripts/run-auto-cct.sh +43 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.registerSchedule = registerSchedule;
|
|
40
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
41
|
+
function registerSchedule(program, deps) {
|
|
42
|
+
const { asyncCommand, loadConfig } = deps;
|
|
43
|
+
program
|
|
44
|
+
.command('schedule')
|
|
45
|
+
.description('Preview auto-cct schedule from sunrise to sunset')
|
|
46
|
+
.option('--lat <latitude>', 'Manual latitude (-90 to 90)')
|
|
47
|
+
.option('--lon <longitude>', 'Manual longitude (-180 to 180)')
|
|
48
|
+
.option('--date <date>', 'Date to preview (ISO format, e.g., 2025-10-26)')
|
|
49
|
+
.option('--interval <minutes>', 'Minutes between schedule entries (default: 30)', '30')
|
|
50
|
+
.action(asyncCommand(async (options) => {
|
|
51
|
+
const { getLocationFromIP } = await Promise.resolve().then(() => __importStar(require('../geoipUtil')));
|
|
52
|
+
const { calculateCCT } = await Promise.resolve().then(() => __importStar(require('../cctUtil')));
|
|
53
|
+
const { getTimes } = await Promise.resolve().then(() => __importStar(require('suncalc')));
|
|
54
|
+
let lat;
|
|
55
|
+
let lon;
|
|
56
|
+
let date = new Date();
|
|
57
|
+
let source = '';
|
|
58
|
+
if (options.date) {
|
|
59
|
+
date = new Date(options.date);
|
|
60
|
+
if (Number.isNaN(date.getTime())) {
|
|
61
|
+
console.error(chalk_1.default.red('Invalid date format. Use ISO format (e.g., 2025-10-26)'));
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (options.lat !== undefined && options.lon !== undefined) {
|
|
66
|
+
lat = parseFloat(options.lat);
|
|
67
|
+
lon = parseFloat(options.lon);
|
|
68
|
+
if (Number.isNaN(lat) || lat < -90 || lat > 90) {
|
|
69
|
+
console.error(chalk_1.default.red('Latitude must be between -90 and 90'));
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
if (Number.isNaN(lon) || lon < -180 || lon > 180) {
|
|
73
|
+
console.error(chalk_1.default.red('Longitude must be between -180 and 180'));
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
source = 'manual';
|
|
77
|
+
}
|
|
78
|
+
else if (loadConfig) {
|
|
79
|
+
const config = loadConfig();
|
|
80
|
+
if (config &&
|
|
81
|
+
typeof config.latitude === 'number' &&
|
|
82
|
+
typeof config.longitude === 'number') {
|
|
83
|
+
lat = config.latitude;
|
|
84
|
+
lon = config.longitude;
|
|
85
|
+
source = 'config';
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (lat === undefined || lon === undefined) {
|
|
89
|
+
try {
|
|
90
|
+
const res = await fetch('https://api.ipify.org?format=json');
|
|
91
|
+
const data = await res.json();
|
|
92
|
+
const location = getLocationFromIP(data.ip);
|
|
93
|
+
if (!location || !location.ll) {
|
|
94
|
+
console.error(chalk_1.default.red('Could not determine location. Use --lat and --lon to specify manually.'));
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
[lat, lon] = location.ll;
|
|
98
|
+
source = `geoip (${data.ip})`;
|
|
99
|
+
}
|
|
100
|
+
catch (_err) {
|
|
101
|
+
console.error(chalk_1.default.red('Could not determine location. Use --lat and --lon to specify manually.'));
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const interval = parseInt(options.interval ?? '30', 10);
|
|
106
|
+
if (Number.isNaN(interval) || interval < 1) {
|
|
107
|
+
console.error(chalk_1.default.red('Interval must be a positive number of minutes'));
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
const times = getTimes(date, lat, lon);
|
|
111
|
+
const sunrise = times.sunrise;
|
|
112
|
+
const sunset = times.sunset;
|
|
113
|
+
const solarNoon = times.solarNoon;
|
|
114
|
+
if (!sunrise ||
|
|
115
|
+
!sunset ||
|
|
116
|
+
Number.isNaN(sunrise.getTime()) ||
|
|
117
|
+
Number.isNaN(sunset.getTime())) {
|
|
118
|
+
console.error(chalk_1.default.red('Could not calculate sunrise/sunset for this location and date'));
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
console.log(chalk_1.default.blue.bold('\n═══════════════════════════════════════════════════════════'));
|
|
122
|
+
console.log(chalk_1.default.blue.bold(' Auto-CCT Schedule Preview'));
|
|
123
|
+
console.log(chalk_1.default.blue.bold('═══════════════════════════════════════════════════════════\n'));
|
|
124
|
+
console.log(chalk_1.default.cyan(`Location: ${lat.toFixed(4)}°, ${lon.toFixed(4)}° (${source})`));
|
|
125
|
+
console.log(chalk_1.default.cyan(`Date: ${date.toLocaleDateString(undefined, { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })}`));
|
|
126
|
+
console.log(chalk_1.default.cyan(`Interval: Every ${interval} minute${interval !== 1 ? 's' : ''}\n`));
|
|
127
|
+
console.log(chalk_1.default.gray(`Sunrise: ${sunrise.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })}`));
|
|
128
|
+
console.log(chalk_1.default.gray(`Solar Noon: ${solarNoon.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })}`));
|
|
129
|
+
console.log(chalk_1.default.gray(`Sunset: ${sunset.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })}`));
|
|
130
|
+
console.log(chalk_1.default.blue('\n───────────────────────────────────────────────────────────'));
|
|
131
|
+
console.log(chalk_1.default.bold('Time CCT Intensity'));
|
|
132
|
+
console.log(chalk_1.default.blue('───────────────────────────────────────────────────────────'));
|
|
133
|
+
const startTime = new Date(sunrise.getTime() - 30 * 60 * 1000);
|
|
134
|
+
const endTime = new Date(sunset.getTime() + 30 * 60 * 1000);
|
|
135
|
+
const intervalMs = interval * 60 * 1000;
|
|
136
|
+
const highlightThreshold = intervalMs / 2;
|
|
137
|
+
let currentTime = new Date(startTime);
|
|
138
|
+
// Respect user-configured bounds if provided
|
|
139
|
+
const cfg = typeof loadConfig === 'function' ? (loadConfig() ?? {}) : {};
|
|
140
|
+
const cctMinRaw = cfg.cctMin;
|
|
141
|
+
const cctMaxRaw = cfg.cctMax;
|
|
142
|
+
const iMinRaw = cfg.intensityMin;
|
|
143
|
+
const iMaxRaw = cfg.intensityMax;
|
|
144
|
+
const hasCctBounds = typeof cctMinRaw === 'number' || typeof cctMaxRaw === 'number';
|
|
145
|
+
const hasIntensityBounds = typeof iMinRaw === 'number' || typeof iMaxRaw === 'number';
|
|
146
|
+
while (currentTime <= endTime) {
|
|
147
|
+
const result = hasCctBounds || hasIntensityBounds
|
|
148
|
+
? calculateCCT(lat, lon, currentTime, {
|
|
149
|
+
cctMinK: typeof cctMinRaw === 'number' ? cctMinRaw : undefined,
|
|
150
|
+
cctMaxK: typeof cctMaxRaw === 'number' ? cctMaxRaw : undefined,
|
|
151
|
+
intensityMinPct: typeof iMinRaw === 'number' ? iMinRaw : undefined,
|
|
152
|
+
intensityMaxPct: typeof iMaxRaw === 'number' ? iMaxRaw : undefined,
|
|
153
|
+
})
|
|
154
|
+
: calculateCCT(lat, lon, currentTime);
|
|
155
|
+
const timeStr = currentTime.toLocaleTimeString(undefined, {
|
|
156
|
+
hour: '2-digit',
|
|
157
|
+
minute: '2-digit',
|
|
158
|
+
});
|
|
159
|
+
const cctStr = `${result.cct}K`.padEnd(10);
|
|
160
|
+
const intensityStr = `${(result.intensity / 10).toFixed(0)}%`;
|
|
161
|
+
let color = chalk_1.default.white;
|
|
162
|
+
const timeDiffSunrise = Math.abs(currentTime.getTime() - sunrise.getTime());
|
|
163
|
+
const timeDiffNoon = Math.abs(currentTime.getTime() - solarNoon.getTime());
|
|
164
|
+
const timeDiffSunset = Math.abs(currentTime.getTime() - sunset.getTime());
|
|
165
|
+
if (timeDiffSunrise < highlightThreshold) {
|
|
166
|
+
color = chalk_1.default.yellow;
|
|
167
|
+
}
|
|
168
|
+
else if (timeDiffNoon < highlightThreshold) {
|
|
169
|
+
color = chalk_1.default.green.bold;
|
|
170
|
+
}
|
|
171
|
+
else if (timeDiffSunset < highlightThreshold) {
|
|
172
|
+
color = chalk_1.default.magenta;
|
|
173
|
+
}
|
|
174
|
+
console.log(color(`${timeStr} ${cctStr} ${intensityStr}`));
|
|
175
|
+
currentTime = new Date(currentTime.getTime() + intervalMs);
|
|
176
|
+
}
|
|
177
|
+
console.log(chalk_1.default.blue('───────────────────────────────────────────────────────────\n'));
|
|
178
|
+
console.log(chalk_1.default.gray('Legend: ') +
|
|
179
|
+
chalk_1.default.yellow('Sunrise') +
|
|
180
|
+
chalk_1.default.gray(' | ') +
|
|
181
|
+
chalk_1.default.green.bold('Solar Noon') +
|
|
182
|
+
chalk_1.default.gray(' | ') +
|
|
183
|
+
chalk_1.default.magenta('Sunset'));
|
|
184
|
+
console.log();
|
|
185
|
+
}));
|
|
186
|
+
}
|
|
187
|
+
exports.default = registerSchedule;
|
|
188
|
+
//# sourceMappingURL=schedule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/commands/schedule.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,UAAU,CAAC;AAE5D,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QAoTlE;AA8CD,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.registerService = registerService;
|
|
40
|
+
const node_child_process_1 = require("node:child_process");
|
|
41
|
+
const fs = __importStar(require("node:fs"));
|
|
42
|
+
const path = __importStar(require("node:path"));
|
|
43
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
44
|
+
function registerService(program, deps) {
|
|
45
|
+
const { asyncCommand } = deps;
|
|
46
|
+
const serviceCommand = program
|
|
47
|
+
.command('circadian-service')
|
|
48
|
+
.alias('service')
|
|
49
|
+
.description('Manage auto-cct circadian lighting background service');
|
|
50
|
+
// Install service
|
|
51
|
+
serviceCommand
|
|
52
|
+
.command('install')
|
|
53
|
+
.description('Install auto-cct as a circadian lighting background service (runs every minute)')
|
|
54
|
+
.option('--interval <seconds>', 'Interval in seconds (default: 60)', '60')
|
|
55
|
+
.action(asyncCommand(async (options) => {
|
|
56
|
+
const interval = parseInt(options.interval ?? '60', 10);
|
|
57
|
+
if (Number.isNaN(interval) || interval < 10) {
|
|
58
|
+
console.error(chalk_1.default.red('Interval must be at least 10 seconds'));
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
// Determine CLI path - check if globally installed or local
|
|
62
|
+
let cliPath;
|
|
63
|
+
let isGlobal = false;
|
|
64
|
+
// Check if running from global installation
|
|
65
|
+
try {
|
|
66
|
+
const { stdout } = await runCommand('which', ['amaran-cli']);
|
|
67
|
+
const globalPath = stdout.trim();
|
|
68
|
+
if (globalPath && fs.existsSync(globalPath)) {
|
|
69
|
+
cliPath = globalPath;
|
|
70
|
+
isGlobal = true;
|
|
71
|
+
console.log(chalk_1.default.blue(`✓ Detected global installation: ${cliPath}`));
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
throw new Error('Not found in PATH');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Fall back to local development path
|
|
79
|
+
const projectDir = path.resolve(__dirname, '..');
|
|
80
|
+
cliPath = path.join(projectDir, 'dist', 'cli.js');
|
|
81
|
+
// Check if CLI is built locally
|
|
82
|
+
if (!fs.existsSync(cliPath)) {
|
|
83
|
+
console.error(chalk_1.default.red('CLI not found. Please either:'));
|
|
84
|
+
console.error(chalk_1.default.red(' 1. Install globally: npm install -g .'));
|
|
85
|
+
console.error(chalk_1.default.red(' 2. Or build locally: npm run build'));
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
console.log(chalk_1.default.blue(`✓ Using local development build: ${cliPath}`));
|
|
89
|
+
}
|
|
90
|
+
const homeDir = process.env.HOME;
|
|
91
|
+
if (!homeDir) {
|
|
92
|
+
console.error(chalk_1.default.red('HOME environment variable not set'));
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
const plistName = 'com.hmmfn.amaran.circadian-service';
|
|
96
|
+
const plistPath = path.join(homeDir, 'Library', 'LaunchAgents', `${plistName}.plist`);
|
|
97
|
+
const logDir = path.join(homeDir, 'Library', 'Logs');
|
|
98
|
+
const nodePath = process.execPath;
|
|
99
|
+
// Ensure log directory exists
|
|
100
|
+
if (!fs.existsSync(logDir)) {
|
|
101
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
102
|
+
}
|
|
103
|
+
const plistContent = `<?xml version="1.0" encoding="UTF-8"?>
|
|
104
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
105
|
+
<plist version="1.0">
|
|
106
|
+
<dict>
|
|
107
|
+
<key>Label</key>
|
|
108
|
+
<string>${plistName}</string>
|
|
109
|
+
<key>ProgramArguments</key>
|
|
110
|
+
<array>
|
|
111
|
+
<string>${nodePath}</string>
|
|
112
|
+
<string>${cliPath}</string>
|
|
113
|
+
<string>auto-cct</string>
|
|
114
|
+
</array>
|
|
115
|
+
<key>StartInterval</key>
|
|
116
|
+
<integer>${interval}</integer>
|
|
117
|
+
<key>RunAtLoad</key>
|
|
118
|
+
<true/>
|
|
119
|
+
<key>KeepAlive</key>
|
|
120
|
+
<false/>
|
|
121
|
+
<key>StandardOutPath</key>
|
|
122
|
+
<string>${path.join(logDir, 'amaran-circadian-service.log')}</string>
|
|
123
|
+
<key>StandardErrorPath</key>
|
|
124
|
+
<string>${path.join(logDir, 'amaran-circadian-service-error.log')}</string>
|
|
125
|
+
${!isGlobal
|
|
126
|
+
? `<key>WorkingDirectory</key>
|
|
127
|
+
<string>${path.dirname(path.dirname(cliPath))}</string>`
|
|
128
|
+
: ''}
|
|
129
|
+
</dict>
|
|
130
|
+
</plist>`;
|
|
131
|
+
try {
|
|
132
|
+
// Write plist file
|
|
133
|
+
fs.writeFileSync(plistPath, plistContent);
|
|
134
|
+
console.log(chalk_1.default.green(`✓ Created service file: ${plistPath}`));
|
|
135
|
+
// Load the service
|
|
136
|
+
await runCommand('launchctl', ['load', plistPath]);
|
|
137
|
+
console.log(chalk_1.default.green(`✓ Circadian lighting service installed and started`));
|
|
138
|
+
console.log(chalk_1.default.blue(` Installation type: ${isGlobal ? 'Global' : 'Local development'}`));
|
|
139
|
+
console.log(chalk_1.default.blue(` CLI path: ${cliPath}`));
|
|
140
|
+
console.log(chalk_1.default.blue(` Running auto-cct every ${interval} seconds`));
|
|
141
|
+
console.log(chalk_1.default.gray(` Logs: ${path.join(logDir, 'amaran-circadian-service.log')}`));
|
|
142
|
+
console.log(chalk_1.default.gray(` Errors: ${path.join(logDir, 'amaran-circadian-service-error.log')}`));
|
|
143
|
+
appendServiceLog(`Service installed (${isGlobal ? 'global' : 'local'}) interval=${interval}s`);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
const err = error;
|
|
147
|
+
console.error(chalk_1.default.red('Failed to install circadian lighting service:'), err.message);
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
}));
|
|
151
|
+
// Uninstall service
|
|
152
|
+
serviceCommand
|
|
153
|
+
.command('uninstall')
|
|
154
|
+
.description('Uninstall circadian lighting background service')
|
|
155
|
+
.action(asyncCommand(async () => {
|
|
156
|
+
const homeDir = process.env.HOME;
|
|
157
|
+
if (!homeDir) {
|
|
158
|
+
console.error(chalk_1.default.red('HOME environment variable not set'));
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
const plistName = 'com.hmmfn.amaran.circadian-service';
|
|
162
|
+
const plistPath = path.join(homeDir, 'Library', 'LaunchAgents', `${plistName}.plist`);
|
|
163
|
+
try {
|
|
164
|
+
if (fs.existsSync(plistPath)) {
|
|
165
|
+
// Unload the service
|
|
166
|
+
await runCommand('launchctl', ['unload', plistPath]);
|
|
167
|
+
// Remove the plist file
|
|
168
|
+
fs.unlinkSync(plistPath);
|
|
169
|
+
console.log(chalk_1.default.green('✓ Circadian lighting service uninstalled successfully'));
|
|
170
|
+
appendServiceLog('Service uninstalled');
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
console.log(chalk_1.default.yellow('Circadian lighting service not found (already uninstalled)'));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
const err = error;
|
|
178
|
+
console.error(chalk_1.default.red('Failed to uninstall circadian lighting service:'), err.message);
|
|
179
|
+
process.exit(1);
|
|
180
|
+
}
|
|
181
|
+
}));
|
|
182
|
+
// Status command
|
|
183
|
+
serviceCommand
|
|
184
|
+
.command('status')
|
|
185
|
+
.description('Check circadian lighting service status')
|
|
186
|
+
.action(asyncCommand(async () => {
|
|
187
|
+
const homeDir = process.env.HOME;
|
|
188
|
+
if (!homeDir) {
|
|
189
|
+
console.error(chalk_1.default.red('HOME environment variable not set'));
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
const plistName = 'com.hmmfn.amaran.circadian-service';
|
|
193
|
+
const plistPath = path.join(homeDir, 'Library', 'LaunchAgents', `${plistName}.plist`);
|
|
194
|
+
const logPath = path.join(homeDir, 'Library', 'Logs', 'amaran-circadian-service.log');
|
|
195
|
+
const errorLogPath = path.join(homeDir, 'Library', 'Logs', 'amaran-circadian-service-error.log');
|
|
196
|
+
try {
|
|
197
|
+
if (!fs.existsSync(plistPath)) {
|
|
198
|
+
console.log(chalk_1.default.yellow('Circadian lighting service not installed'));
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
// Check if service is loaded
|
|
202
|
+
const { stdout } = await runCommand('launchctl', ['list']);
|
|
203
|
+
const isLoaded = stdout.includes(plistName);
|
|
204
|
+
console.log(chalk_1.default.blue('Circadian Lighting Service Status:'));
|
|
205
|
+
console.log(` Installed: ${chalk_1.default.green('✓')}`);
|
|
206
|
+
console.log(` Running: ${isLoaded ? chalk_1.default.green('✓') : chalk_1.default.red('✗')}`);
|
|
207
|
+
console.log(` Config: ${plistPath}`);
|
|
208
|
+
if (fs.existsSync(logPath)) {
|
|
209
|
+
const logStats = fs.statSync(logPath);
|
|
210
|
+
console.log(` Last run: ${logStats.mtime.toLocaleString()}`);
|
|
211
|
+
// Show last few lines of log
|
|
212
|
+
const logContent = fs.readFileSync(logPath, 'utf8');
|
|
213
|
+
const lastLines = logContent.trim().split('\n').slice(-3);
|
|
214
|
+
if (lastLines.length > 0 && lastLines[0]) {
|
|
215
|
+
console.log(chalk_1.default.gray(' Recent output:'));
|
|
216
|
+
for (const line of lastLines) {
|
|
217
|
+
console.log(chalk_1.default.gray(` ${line}`));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (fs.existsSync(errorLogPath)) {
|
|
222
|
+
const errorContent = fs.readFileSync(errorLogPath, 'utf8').trim();
|
|
223
|
+
if (errorContent) {
|
|
224
|
+
console.log(chalk_1.default.red(' Recent errors:'));
|
|
225
|
+
errorContent
|
|
226
|
+
.split('\n')
|
|
227
|
+
.slice(-3)
|
|
228
|
+
.forEach((line) => {
|
|
229
|
+
if (line.trim())
|
|
230
|
+
console.log(chalk_1.default.red(` ${line}`));
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
const err = error;
|
|
237
|
+
console.error(chalk_1.default.red('Failed to check circadian lighting service status:'), err.message);
|
|
238
|
+
}
|
|
239
|
+
}));
|
|
240
|
+
// Start service
|
|
241
|
+
serviceCommand
|
|
242
|
+
.command('start')
|
|
243
|
+
.description('Start circadian lighting service')
|
|
244
|
+
.action(asyncCommand(async () => {
|
|
245
|
+
const plistName = 'com.hmmfn.amaran.circadian-service';
|
|
246
|
+
try {
|
|
247
|
+
await runCommand('launchctl', ['start', plistName]);
|
|
248
|
+
console.log(chalk_1.default.green('✓ Circadian lighting service started'));
|
|
249
|
+
appendServiceLog('Service start requested');
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
const err = error;
|
|
253
|
+
console.error(chalk_1.default.red('Failed to start circadian lighting service:'), err.message);
|
|
254
|
+
}
|
|
255
|
+
}));
|
|
256
|
+
// Stop service
|
|
257
|
+
serviceCommand
|
|
258
|
+
.command('stop')
|
|
259
|
+
.description('Stop circadian lighting service')
|
|
260
|
+
.action(asyncCommand(async () => {
|
|
261
|
+
const plistName = 'com.hmmfn.amaran.circadian-service';
|
|
262
|
+
try {
|
|
263
|
+
await runCommand('launchctl', ['stop', plistName]);
|
|
264
|
+
console.log(chalk_1.default.green('✓ Circadian lighting service stopped'));
|
|
265
|
+
appendServiceLog('Service stop requested');
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
const err = error;
|
|
269
|
+
console.error(chalk_1.default.red('Failed to stop circadian lighting service:'), err.message);
|
|
270
|
+
}
|
|
271
|
+
}));
|
|
272
|
+
// Logs command
|
|
273
|
+
serviceCommand
|
|
274
|
+
.command('logs')
|
|
275
|
+
.description('Show circadian lighting service logs')
|
|
276
|
+
.option('-f, --follow', 'Follow log output')
|
|
277
|
+
.option('-e, --errors', 'Show error logs instead')
|
|
278
|
+
.action(asyncCommand(async (options) => {
|
|
279
|
+
const homeDir = process.env.HOME;
|
|
280
|
+
if (!homeDir) {
|
|
281
|
+
console.error(chalk_1.default.red('HOME environment variable not set'));
|
|
282
|
+
process.exit(1);
|
|
283
|
+
}
|
|
284
|
+
const logFile = options.errors
|
|
285
|
+
? 'amaran-circadian-service-error.log'
|
|
286
|
+
: 'amaran-circadian-service.log';
|
|
287
|
+
const logPath = path.join(homeDir, 'Library', 'Logs', logFile);
|
|
288
|
+
if (!fs.existsSync(logPath)) {
|
|
289
|
+
console.log(chalk_1.default.yellow(`No ${options.errors ? 'error ' : ''}logs found`));
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
try {
|
|
293
|
+
if (options.follow) {
|
|
294
|
+
console.log(chalk_1.default.blue(`Following ${logFile}... (Ctrl+C to stop)`));
|
|
295
|
+
(0, node_child_process_1.spawn)('tail', ['-f', logPath], { stdio: 'inherit' });
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
const content = fs.readFileSync(logPath, 'utf8');
|
|
299
|
+
console.log(content);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
const err = error;
|
|
304
|
+
console.error(chalk_1.default.red('Failed to read logs:'), err.message);
|
|
305
|
+
}
|
|
306
|
+
}));
|
|
307
|
+
}
|
|
308
|
+
function appendServiceLog(message) {
|
|
309
|
+
const homeDir = process.env.HOME;
|
|
310
|
+
if (!homeDir) {
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
const logDir = path.join(homeDir, 'Library', 'Logs');
|
|
314
|
+
const logPath = path.join(logDir, 'amaran-circadian-service.log');
|
|
315
|
+
try {
|
|
316
|
+
if (!fs.existsSync(logDir)) {
|
|
317
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
318
|
+
}
|
|
319
|
+
const timestamp = new Date().toISOString();
|
|
320
|
+
fs.appendFileSync(logPath, `[${timestamp}] ${message}\n`);
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
const err = error;
|
|
324
|
+
console.error(chalk_1.default.red('Failed to write to service log:'), err.message);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
// Helper function to run shell commands
|
|
328
|
+
function runCommand(command, args) {
|
|
329
|
+
return new Promise((resolve, reject) => {
|
|
330
|
+
const child = (0, node_child_process_1.spawn)(command, args, { stdio: 'pipe' });
|
|
331
|
+
let stdout = '';
|
|
332
|
+
let stderr = '';
|
|
333
|
+
child.stdout.on('data', (data) => {
|
|
334
|
+
stdout += data.toString();
|
|
335
|
+
});
|
|
336
|
+
child.stderr.on('data', (data) => {
|
|
337
|
+
stderr += data.toString();
|
|
338
|
+
});
|
|
339
|
+
child.on('close', (code) => {
|
|
340
|
+
if (code === 0) {
|
|
341
|
+
resolve({ stdout, stderr });
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
reject(new Error(`Command failed with code ${code}: ${stderr}`));
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
exports.default = registerService;
|
|
350
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,UAAU,CAAC;AAE5D,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QA2DjE;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.registerStatus = registerStatus;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
function registerStatus(program, deps) {
|
|
9
|
+
const { createController, findDevice, asyncCommand } = deps;
|
|
10
|
+
program
|
|
11
|
+
.command('status <device>')
|
|
12
|
+
.description('Get the current status of a light')
|
|
13
|
+
.option('-u, --url <url>', 'WebSocket URL')
|
|
14
|
+
.option('-c, --client-id <id>', 'Client ID')
|
|
15
|
+
.option('-d, --debug', 'Enable debug mode')
|
|
16
|
+
.action(asyncCommand(async (deviceQuery, options) => {
|
|
17
|
+
const controller = await createController(options.url, options.clientId, options.debug);
|
|
18
|
+
const device = findDevice(controller, deviceQuery);
|
|
19
|
+
if (!device) {
|
|
20
|
+
console.error(chalk_1.default.red(`Device "${deviceQuery}" not found`));
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
if (!device.node_id) {
|
|
24
|
+
console.error(chalk_1.default.red(`Device "${deviceQuery}" has no node_id`));
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
const nodeId = device.node_id;
|
|
28
|
+
controller.getLightSleepStatus(nodeId, (success, message, data) => {
|
|
29
|
+
if (success) {
|
|
30
|
+
const nodeConfig = controller.getNode(nodeId);
|
|
31
|
+
const displayName = device.device_name || device.name || device.id || device.node_id || 'Unknown';
|
|
32
|
+
console.log(chalk_1.default.blue(`Status for ${displayName}:`));
|
|
33
|
+
console.log(` State: ${data?.sleep ? chalk_1.default.red('Off') : chalk_1.default.green('On')}`);
|
|
34
|
+
if (nodeConfig) {
|
|
35
|
+
if (nodeConfig.intensity !== undefined) {
|
|
36
|
+
console.log(` Intensity: ${nodeConfig.intensity}%`);
|
|
37
|
+
}
|
|
38
|
+
if (nodeConfig.cct !== undefined) {
|
|
39
|
+
console.log(` Temperature: ${nodeConfig.cct}K`);
|
|
40
|
+
}
|
|
41
|
+
if (nodeConfig.hue !== undefined && nodeConfig.sat !== undefined) {
|
|
42
|
+
console.log(` HSI: H:${nodeConfig.hue} S:${nodeConfig.sat} I:${nodeConfig.intensity}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
console.error(chalk_1.default.red(`✗ Failed to get status: ${message}`));
|
|
48
|
+
}
|
|
49
|
+
controller.disconnect();
|
|
50
|
+
});
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
exports.default = registerStatus;
|
|
54
|
+
//# sourceMappingURL=status.js.map
|