@sentiness/cli 0.2.0
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 +10 -0
- package/dist/bootstrap.d.ts +16 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +79 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +3 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +16 -0
- package/dist/logger.js.map +1 -0
- package/dist/node-fs.d.ts +3 -0
- package/dist/node-fs.d.ts.map +1 -0
- package/dist/node-fs.js +38 -0
- package/dist/node-fs.js.map +1 -0
- package/dist/node-process.d.ts +3 -0
- package/dist/node-process.d.ts.map +1 -0
- package/dist/node-process.js +30 -0
- package/dist/node-process.js.map +1 -0
- package/package.json +43 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Yan Lucas
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# @sentiness/cli
|
|
2
|
+
|
|
3
|
+
The thin global launcher for Sentiness. It reads the project's engine pin and
|
|
4
|
+
`sentiness.lock`, fetches `@sentiness/core` at the pinned version into
|
|
5
|
+
`~/.sentiness/cache` (overridable with `SENTINESS_HOME`), and spawns it with
|
|
6
|
+
`--cache-root`, forwarding every argument and the engine's exit code. It has no
|
|
7
|
+
dependency on `@sentiness/core` — that is what it fetches. Install it once with
|
|
8
|
+
`npm i -g @sentiness/cli`. For local engine development, point
|
|
9
|
+
`SENTINESS_ENGINE_PATH` at a built `@sentiness/core` checkout to bypass the
|
|
10
|
+
fetch.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { FileSystem, Logger, ProcessRunner } from '@sentiness/check-sdk';
|
|
2
|
+
export interface LauncherDeps {
|
|
3
|
+
readonly cwd: string;
|
|
4
|
+
readonly env: Readonly<Record<string, string>>;
|
|
5
|
+
readonly fs: FileSystem;
|
|
6
|
+
readonly process: ProcessRunner;
|
|
7
|
+
readonly logger: Logger;
|
|
8
|
+
readonly stdout: {
|
|
9
|
+
write(text: string): void;
|
|
10
|
+
};
|
|
11
|
+
readonly stderr: {
|
|
12
|
+
write(text: string): void;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export declare function run(argv: readonly string[], deps: LauncherDeps): Promise<number>;
|
|
16
|
+
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE;QAAE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE;QAAE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CAChD;AAmED,wBAAsB,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAwCtF"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
const MARKER = '.sentiness-materialized';
|
|
3
|
+
function cacheRootFrom(env) {
|
|
4
|
+
return env.SENTINESS_HOME ?? join(env.HOME ?? env.USERPROFILE ?? '.', '.sentiness');
|
|
5
|
+
}
|
|
6
|
+
async function readJson(fs, path) {
|
|
7
|
+
if (!(await fs.exists(path))) {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
const parsed = JSON.parse(await fs.readFile(path));
|
|
12
|
+
return typeof parsed === 'object' && parsed !== null
|
|
13
|
+
? parsed
|
|
14
|
+
: undefined;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function fetchEngine(deps, slot, version) {
|
|
21
|
+
await deps.fs.mkdir(slot, { recursive: true });
|
|
22
|
+
await deps.fs.writeFile(join(slot, 'package.json'), JSON.stringify({ private: true }));
|
|
23
|
+
const result = await deps.process.execFile('npm', [
|
|
24
|
+
'install',
|
|
25
|
+
'--prefix',
|
|
26
|
+
slot,
|
|
27
|
+
'--no-save',
|
|
28
|
+
'--no-audit',
|
|
29
|
+
'--no-fund',
|
|
30
|
+
`@sentiness/core@${version}`,
|
|
31
|
+
]);
|
|
32
|
+
if (result.exitCode !== 0) {
|
|
33
|
+
deps.stderr.write(`Failed to fetch @sentiness/core@${version}: ${result.stderr.trim()}\n`);
|
|
34
|
+
return 3;
|
|
35
|
+
}
|
|
36
|
+
await deps.fs.writeFile(join(slot, MARKER), new Date().toISOString());
|
|
37
|
+
return 0;
|
|
38
|
+
}
|
|
39
|
+
async function spawnEngine(deps, engineEntry, cacheRoot, argv) {
|
|
40
|
+
const result = await deps.process.execFile('node', [engineEntry, '--cache-root', cacheRoot, ...argv], {
|
|
41
|
+
cwd: deps.cwd,
|
|
42
|
+
});
|
|
43
|
+
if (result.stdout.length > 0) {
|
|
44
|
+
deps.stdout.write(result.stdout);
|
|
45
|
+
}
|
|
46
|
+
if (result.stderr.length > 0) {
|
|
47
|
+
deps.stderr.write(result.stderr);
|
|
48
|
+
}
|
|
49
|
+
return result.exitCode;
|
|
50
|
+
}
|
|
51
|
+
export async function run(argv, deps) {
|
|
52
|
+
// Dev bypass: a local engine checkout.
|
|
53
|
+
const enginePathOverride = deps.env.SENTINESS_ENGINE_PATH;
|
|
54
|
+
const config = (await readJson(deps.fs, join(deps.cwd, 'sentiness.config.json'))) ??
|
|
55
|
+
(await readJson(deps.fs, join(deps.cwd, 'sentiness.config.js')));
|
|
56
|
+
if (!config && !enginePathOverride) {
|
|
57
|
+
deps.stderr.write('No sentiness.config.json found. Run `sentiness init` first.\n');
|
|
58
|
+
return 3;
|
|
59
|
+
}
|
|
60
|
+
const cacheRoot = cacheRootFrom(deps.env);
|
|
61
|
+
if (enginePathOverride) {
|
|
62
|
+
return spawnEngine(deps, join(enginePathOverride, 'dist', 'cli', 'index.js'), cacheRoot, argv);
|
|
63
|
+
}
|
|
64
|
+
const lock = await readJson(deps.fs, join(deps.cwd, 'sentiness.lock'));
|
|
65
|
+
const engineVersion = lock?.engine?.version;
|
|
66
|
+
if (!engineVersion) {
|
|
67
|
+
deps.stderr.write('sentiness.lock is missing or has no engine version. Run `sentiness install`.\n');
|
|
68
|
+
return 3;
|
|
69
|
+
}
|
|
70
|
+
const engineSlot = join(cacheRoot, 'cache', 'engine', engineVersion);
|
|
71
|
+
if (!(await deps.fs.exists(join(engineSlot, MARKER)))) {
|
|
72
|
+
const fetched = await fetchEngine(deps, engineSlot, engineVersion);
|
|
73
|
+
if (fetched !== 0) {
|
|
74
|
+
return fetched;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return spawnEngine(deps, join(engineSlot, 'node_modules', '@sentiness', 'core', 'dist', 'cli', 'index.js'), cacheRoot, argv);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { writeSync } from 'node:fs';
|
|
3
|
+
import process from 'node:process';
|
|
4
|
+
import { run } from './bootstrap.js';
|
|
5
|
+
import { createLogger } from './logger.js';
|
|
6
|
+
import { createNodeFileSystem } from './node-fs.js';
|
|
7
|
+
import { createProcessRunner } from './node-process.js';
|
|
8
|
+
function envRecord() {
|
|
9
|
+
const result = {};
|
|
10
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
11
|
+
if (value !== undefined) {
|
|
12
|
+
result[key] = value;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
async function main() {
|
|
18
|
+
const deps = {
|
|
19
|
+
cwd: process.cwd(),
|
|
20
|
+
env: envRecord(),
|
|
21
|
+
fs: createNodeFileSystem(),
|
|
22
|
+
process: createProcessRunner(),
|
|
23
|
+
logger: createLogger(),
|
|
24
|
+
stdout: { write: (text) => writeSync(process.stdout.fd, text) },
|
|
25
|
+
stderr: { write: (text) => writeSync(process.stderr.fd, text) },
|
|
26
|
+
};
|
|
27
|
+
const code = await run(process.argv.slice(2), deps);
|
|
28
|
+
process.exitCode = code;
|
|
29
|
+
}
|
|
30
|
+
await main();
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,SAAS,SAAS;IAChB,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG;QACX,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,GAAG,EAAE,SAAS,EAAE;QAChB,EAAE,EAAE,oBAAoB,EAAE;QAC1B,OAAO,EAAE,mBAAmB,EAAE;QAC9B,MAAM,EAAE,YAAY,EAAE;QACtB,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE;QACvE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE;KACxE,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACpD,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC1B,CAAC;AAED,MAAM,IAAI,EAAE,CAAC"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAInD,wBAAgB,YAAY,IAAI,MAAM,CAWrC"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { writeSync } from 'node:fs';
|
|
2
|
+
// A minimal stderr Logger. stdout is reserved for the engine's report JSON, so
|
|
3
|
+
// every level goes to fd 2.
|
|
4
|
+
export function createLogger() {
|
|
5
|
+
const emit = (level, message, fields) => {
|
|
6
|
+
const suffix = fields && Object.keys(fields).length > 0 ? ` ${JSON.stringify(fields)}` : '';
|
|
7
|
+
writeSync(2, `[sentiness:${level}] ${message}${suffix}\n`);
|
|
8
|
+
};
|
|
9
|
+
return {
|
|
10
|
+
debug: (message, fields) => emit('debug', message, fields),
|
|
11
|
+
info: (message, fields) => emit('info', message, fields),
|
|
12
|
+
warn: (message, fields) => emit('warn', message, fields),
|
|
13
|
+
error: (message, fields) => emit('error', message, fields),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,+EAA+E;AAC/E,4BAA4B;AAC5B,MAAM,UAAU,YAAY;IAC1B,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,OAAe,EAAE,MAAgC,EAAQ,EAAE;QACtF,MAAM,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,SAAS,CAAC,CAAC,EAAE,cAAc,KAAK,KAAK,OAAO,GAAG,MAAM,IAAI,CAAC,CAAC;IAC7D,CAAC,CAAC;IACF,OAAO;QACL,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC;QAC1D,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;QACxD,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;QACxD,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC;KAC3D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-fs.d.ts","sourceRoot":"","sources":["../src/node-fs.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAKvD,wBAAgB,oBAAoB,IAAI,UAAU,CA+BjD"}
|
package/dist/node-fs.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { appendFile, chmod, mkdir, readdir, readFile, realpath, rename, rm, stat, writeFile, } from 'node:fs/promises';
|
|
2
|
+
// A FileSystem over node:fs/promises. The launcher uses only a subset (exists,
|
|
3
|
+
// readFile, writeFile, mkdir), but the full interface is implemented so it can
|
|
4
|
+
// stand in wherever a FileSystem is expected without depending on @sentiness/core.
|
|
5
|
+
export function createNodeFileSystem() {
|
|
6
|
+
return {
|
|
7
|
+
readFile: (path) => readFile(path, 'utf8'),
|
|
8
|
+
writeFile: (path, content) => writeFile(path, content, 'utf8'),
|
|
9
|
+
appendFile: (path, content) => appendFile(path, content, 'utf8'),
|
|
10
|
+
rename: (from, to) => rename(from, to),
|
|
11
|
+
async exists(path) {
|
|
12
|
+
try {
|
|
13
|
+
await stat(path);
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
async mkdir(path, options) {
|
|
21
|
+
await mkdir(path, { recursive: options?.recursive ?? false });
|
|
22
|
+
},
|
|
23
|
+
rm: (path, options) => rm(path, { recursive: options?.recursive, force: options?.force }),
|
|
24
|
+
chmod: (path, mode) => chmod(path, mode),
|
|
25
|
+
readDir: (path) => readdir(path),
|
|
26
|
+
async stat(path) {
|
|
27
|
+
const stats = await stat(path);
|
|
28
|
+
return {
|
|
29
|
+
isFile: stats.isFile(),
|
|
30
|
+
isDirectory: stats.isDirectory(),
|
|
31
|
+
size: stats.size,
|
|
32
|
+
mtimeMs: stats.mtimeMs,
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
realpath: (path) => realpath(path),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=node-fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-fs.js","sourceRoot":"","sources":["../src/node-fs.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,KAAK,EACL,KAAK,EACL,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,EAAE,EACF,IAAI,EACJ,SAAS,GACV,MAAM,kBAAkB,CAAC;AAG1B,+EAA+E;AAC/E,+EAA+E;AAC/E,mFAAmF;AACnF,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAC1C,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC;QAC9D,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC;QAChE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACtC,KAAK,CAAC,MAAM,CAAC,IAAI;YACf,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO;YACvB,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,KAAK,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACzF,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;QACxC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,IAAI;YACb,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,OAAO;gBACL,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE;gBACtB,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE;gBAChC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC;QACJ,CAAC;QACD,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;KACnC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-process.d.ts","sourceRoot":"","sources":["../src/node-process.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmC,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM3F,wBAAgB,mBAAmB,IAAI,aAAa,CAuBnD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
// A ProcessRunner that streams child stdio straight to the launcher's own stdio
|
|
3
|
+
// with `inherit`. Long-running engine checks must show output live rather than
|
|
4
|
+
// buffering, so stdout/stderr are returned empty and the child writes directly
|
|
5
|
+
// to the terminal. The launcher only inspects the exit code in that case.
|
|
6
|
+
export function createProcessRunner() {
|
|
7
|
+
return {
|
|
8
|
+
execFile(command, args, options) {
|
|
9
|
+
return new Promise((resolve) => {
|
|
10
|
+
const child = spawn(command, [...args], {
|
|
11
|
+
cwd: options?.cwd,
|
|
12
|
+
stdio: 'inherit',
|
|
13
|
+
signal: options?.signal,
|
|
14
|
+
});
|
|
15
|
+
child.on('error', (error) => {
|
|
16
|
+
resolve({ stdout: '', stderr: error.message, exitCode: 1 });
|
|
17
|
+
});
|
|
18
|
+
child.on('close', (code, signal) => {
|
|
19
|
+
resolve({
|
|
20
|
+
stdout: '',
|
|
21
|
+
stderr: '',
|
|
22
|
+
exitCode: code ?? 1,
|
|
23
|
+
...(signal ? { signal } : {}),
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=node-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-process.js","sourceRoot":"","sources":["../src/node-process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,gFAAgF;AAChF,+EAA+E;AAC/E,+EAA+E;AAC/E,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,OAAyB;YAC/C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE;oBACtC,GAAG,EAAE,OAAO,EAAE,GAAG;oBACjB,KAAK,EAAE,SAAS;oBAChB,MAAM,EAAE,OAAO,EAAE,MAAM;iBACxB,CAAC,CAAC;gBACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC9D,CAAC,CAAC,CAAC;gBACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;oBACjC,OAAO,CAAC;wBACN,MAAM,EAAE,EAAE;wBACV,MAAM,EAAE,EAAE;wBACV,QAAQ,EAAE,IAAI,IAAI,CAAC;wBACnB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC9B,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sentiness/cli",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Thin global launcher for Sentiness: resolves the pinned engine and dispatches.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/Arateki/Sentiness.git",
|
|
9
|
+
"directory": "packages/cli"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/Arateki/Sentiness#readme",
|
|
12
|
+
"bugs": "https://github.com/Arateki/Sentiness/issues",
|
|
13
|
+
"type": "module",
|
|
14
|
+
"bin": {
|
|
15
|
+
"sentiness": "./dist/index.js"
|
|
16
|
+
},
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=20.10"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"README.md"
|
|
23
|
+
],
|
|
24
|
+
"exports": {
|
|
25
|
+
".": {
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"default": "./dist/index.js"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@sentiness/check-sdk": "0.3.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"typescript": "latest",
|
|
35
|
+
"vitest": "latest",
|
|
36
|
+
"@sentiness/_test-utils": "0.1.2"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "node ../../scripts/clean-dist.mjs && tsc -p tsconfig.json",
|
|
40
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
41
|
+
"test": "vitest run --config ../../vitest.config.base.ts src"
|
|
42
|
+
}
|
|
43
|
+
}
|