Add ccc-server/client/queue bins and blessed queue TUI
- bin/ccc-server, ccc-client, ccc-queue wired up via package.json bin - client/config.mjs: shared secrets/user resolution from CLI args or CCC_SECRETS/CCC_USER env vars - ccc-queue: blessed TUI with two-pane layout (list + detail), polls every 2s, y/n to approve/deny selected item, r to refresh, q to quit Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
57
client/config.mjs
Normal file
57
client/config.mjs
Normal file
@@ -0,0 +1,57 @@
|
||||
// Resolve client config from CLI args or environment variables.
|
||||
// Precedence: CLI args > env vars > error
|
||||
//
|
||||
// Env vars:
|
||||
// CCC_SECRETS path to secrets file
|
||||
// CCC_USER username to authenticate as
|
||||
|
||||
import { readFileSync } from 'fs';
|
||||
|
||||
function get_arg(argv, flag) {
|
||||
const i = argv.indexOf(flag);
|
||||
return i !== -1 ? argv[i + 1] : null;
|
||||
}
|
||||
|
||||
export function load_client_config(argv) {
|
||||
const secrets_path = get_arg(argv, '--secrets') || process.env.CCC_SECRETS;
|
||||
const username = get_arg(argv, '--user') || process.env.CCC_USER;
|
||||
|
||||
if (!secrets_path) {
|
||||
console.error('Secrets file required: --secrets <path> or CCC_SECRETS=<path>');
|
||||
process.exit(1);
|
||||
}
|
||||
if (!username) {
|
||||
console.error('Username required: --user <name> or CCC_USER=<name>');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
let secrets;
|
||||
try {
|
||||
secrets = JSON.parse(readFileSync(secrets_path, 'utf8'));
|
||||
} catch (err) {
|
||||
console.error(`Cannot read secrets file: ${err.message}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const user_entry = secrets.users?.[username];
|
||||
if (!user_entry) {
|
||||
console.error(`User '${username}' not found in secrets file`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
return { username, secret: user_entry.secret };
|
||||
}
|
||||
|
||||
export function get_remaining(argv) {
|
||||
const result = [];
|
||||
let i = 2;
|
||||
while (i < argv.length) {
|
||||
if (argv[i] === '--secrets' || argv[i] === '--user') {
|
||||
i += 2;
|
||||
} else {
|
||||
result.push(argv[i]);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
Reference in New Issue
Block a user