@crewx/notify 0.1.0-rc.1

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/SKILL.md ADDED
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: crewx/notify
3
+ description: Notification CLI. Send a single in-app notification to the user's CrewX dashboard for signals that need human attention or judgment.
4
+ metadata:
5
+ version: 0.1.0
6
+ built-in: true
7
+ ---
8
+
9
+ # Notify
10
+
11
+ `notify`는 CrewX 에이전트가 사용자에게 인앱 알림을 하나 보낼 때 쓰는 CLI다.
12
+ 서버의 `POST /api/v1/notifications` 엔드포인트로 알림을 전송하고, 성공하면 알림 id를 출력한다.
13
+
14
+ ## Commands
15
+
16
+ ```bash
17
+ npx crewx notify "<title>" [--level=info|warning|critical] [--body="..."]
18
+ npx crewx notify usage
19
+ ```
20
+
21
+ - `title` (필수) — 알림 제목. 위치 인자로 전달한다.
22
+ - `--level` — 심각도. `info`(기본) | `warning` | `critical` 중 하나. 화이트리스트 밖이면 에러.
23
+ - `--body` — 선택. 상세 본문.
24
+ - `usage` — 이 `SKILL.md`를 그대로 출력한다.
25
+
26
+ ```bash
27
+ npx crewx notify "Deploy needs approval" --level=warning --body="Staging is green; confirm prod."
28
+ ```
29
+
30
+ ## When To Use
31
+
32
+ - 실행이 끝난 뒤 사용자의 판단/승인이 필요한 신호를 보낼 때 (예: 배포 승인 대기, 결정이 막혀 진행이 멈춘 상태)
33
+ - 예약 작업(cron/schedule) 경보처럼 사람이 확인해야 하는 이벤트를 알릴 때
34
+ - 사용자의 주의가 필요한 위험/경고 상황을 전달할 때
35
+
36
+ 사용하지 말아야 할 때:
37
+
38
+ - 루틴한 성공 로그나 진행 상황 중계 — 알림은 사람의 주의를 요구하는 신호에만 쓴다.
39
+
40
+ ## Levels
41
+
42
+ | Level | Meaning |
43
+ |----------|---------|
44
+ | `info` | 일반 정보성 알림 (기본값) |
45
+ | `warning` | 주의가 필요한 상황 |
46
+ | `critical` | 즉시 대응이 필요한 심각한 상황 |
47
+
48
+ ## Environment
49
+
50
+ | Variable | Purpose |
51
+ |----------|---------|
52
+ | `CREWX_WORKSPACE` | 알림을 라우팅할 절대 워크스페이스 경로 (필수) |
53
+ | `CREWX_ENDPOINT` | CrewX 서버 URL (기본값 `http://localhost:8150`) |
54
+ | `CREWX_API_TOKEN` | 원격 서버 접근 토큰. 로컬(localhost)은 토큰이 필요 없다 |
55
+ | `CREWX_AGENT_ID` | 알림을 만든 에이전트 id (있으면 포함) |
56
+ | `CREWX_TASK_ID` | 관련 작업(task) id (있으면 포함) |
57
+ | `CREWX_THREAD_ID` | 관련 스레드(thread) id (있으면 포함) |
58
+
59
+ ## Notes
60
+
61
+ - 로컬 서버는 인증 토큰 없이 동작한다(서버의 loopback bypass). 원격 서버만 `CREWX_API_TOKEN`이 필요하다.
62
+ - 성공 응답은 `201 { success: true, data: { id } }` 형태이며, CLI는 전송된 알림 id를 출력한다.
63
+ - 네트워크/HTTP 실패 시 서버 상태를 먼저 확인한다.
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare function main(inputArgs?: string[]): Promise<void>;
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":";AAuFA,wBAAsB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC9D"}
package/dist/cli.js ADDED
@@ -0,0 +1,159 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.main = main;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const engine_js_1 = require("./src/engine.js");
41
+ let PKG_VERSION = 'unknown';
42
+ try {
43
+ const _pkgPath = fs.existsSync(path.join(__dirname, 'package.json'))
44
+ ? path.join(__dirname, 'package.json')
45
+ : path.join(__dirname, '..', 'package.json');
46
+ const _pkg = JSON.parse(fs.readFileSync(_pkgPath, 'utf-8'));
47
+ if (_pkg?.version)
48
+ PKG_VERSION = String(_pkg.version);
49
+ }
50
+ catch { }
51
+ function printUsage() {
52
+ console.log(`
53
+ @crewx/notify@${PKG_VERSION} - Send an in-app notification to the CrewX dashboard
54
+
55
+ Usage:
56
+ notify "<title>" [options]
57
+ notify usage Show detailed guide (SKILL.md)
58
+
59
+ Options:
60
+ --level=info|warning|critical Severity (default: info)
61
+ --body="<text>" Optional detail body
62
+
63
+ Environment variables:
64
+ CREWX_WORKSPACE Absolute workspace path (required)
65
+ CREWX_ENDPOINT Server URL (default: http://localhost:8150)
66
+ CREWX_API_TOKEN Server auth token (remote servers only)
67
+ CREWX_AGENT_ID Producing agent id (optional)
68
+ CREWX_TASK_ID Originating task id (optional)
69
+ CREWX_THREAD_ID Originating thread id (optional)
70
+
71
+ Example:
72
+ notify "Deploy needs approval" --level=warning --body="Staging is green; confirm prod."
73
+ `);
74
+ }
75
+ function showDetailedUsage() {
76
+ const skillMd = path.join(__dirname, '..', 'SKILL.md');
77
+ if (fs.existsSync(skillMd)) {
78
+ process.stdout.write(fs.readFileSync(skillMd, 'utf-8'));
79
+ }
80
+ else {
81
+ printUsage();
82
+ }
83
+ }
84
+ const BOOLEAN_FLAGS = new Set(['help', 'version']);
85
+ function parseArgs(args) {
86
+ const result = { positional: [], options: {} };
87
+ for (let i = 0; i < args.length; i++) {
88
+ const arg = args[i];
89
+ if (arg === '-h') {
90
+ result.options['help'] = true;
91
+ }
92
+ else if (arg.startsWith('--')) {
93
+ const eqIdx = arg.indexOf('=');
94
+ if (eqIdx !== -1) {
95
+ result.options[arg.slice(2, eqIdx)] = arg.slice(eqIdx + 1);
96
+ }
97
+ else {
98
+ const key = arg.slice(2);
99
+ if (!BOOLEAN_FLAGS.has(key)) {
100
+ const next = args[i + 1];
101
+ if (next !== undefined && !next.startsWith('--') && next !== '-h') {
102
+ result.options[key] = next;
103
+ i++;
104
+ }
105
+ else {
106
+ result.options[key] = true;
107
+ }
108
+ }
109
+ else {
110
+ result.options[key] = true;
111
+ }
112
+ }
113
+ }
114
+ else {
115
+ result.positional.push(arg);
116
+ }
117
+ }
118
+ return result;
119
+ }
120
+ async function main(inputArgs) {
121
+ const args = inputArgs ?? process.argv.slice(2);
122
+ const { positional, options } = parseArgs(args);
123
+ const [first] = positional;
124
+ if (options['version']) {
125
+ console.log(PKG_VERSION);
126
+ return;
127
+ }
128
+ if (first === 'usage') {
129
+ showDetailedUsage();
130
+ return;
131
+ }
132
+ if (options['help'] || first === 'help') {
133
+ printUsage();
134
+ return;
135
+ }
136
+ const title = first;
137
+ if (!title) {
138
+ console.error('Error: notify requires a title.');
139
+ printUsage();
140
+ process.exit(1);
141
+ }
142
+ const levelRaw = options['level'];
143
+ const level = levelRaw === undefined ? 'info' : String(levelRaw);
144
+ if (!engine_js_1.NOTIFY_LEVELS.includes(level)) {
145
+ console.error(`Error: invalid --level '${level}'. Must be one of: ${engine_js_1.NOTIFY_LEVELS.join(', ')}`);
146
+ process.exit(1);
147
+ }
148
+ const body = typeof options['body'] === 'string' ? options['body'] : undefined;
149
+ const engine = new engine_js_1.NotifyEngine();
150
+ const { id } = await engine.send({ title, level, body });
151
+ console.log(`Notification sent (id: ${id}, level: ${level})`);
152
+ }
153
+ if (require.main === module) {
154
+ main().catch((e) => {
155
+ console.error(e.message);
156
+ process.exit(1);
157
+ });
158
+ }
159
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare const NOTIFY_LEVELS: readonly ["info", "warning", "critical"];
2
+ export type NotifyLevel = (typeof NOTIFY_LEVELS)[number];
3
+ export interface SendOptions {
4
+ title: string;
5
+ level?: string;
6
+ body?: string;
7
+ }
8
+ export interface SendResult {
9
+ id: string;
10
+ }
11
+ export declare class NotifyEngine {
12
+ private get endpoint();
13
+ send(opts: SendOptions): Promise<SendResult>;
14
+ }
15
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,0CAA2C,CAAC;AACtE,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,MAAM,WAAW,WAAW;IAE1B,KAAK,EAAE,MAAM,CAAC;IAEd,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;CACZ;AAaD,qBAAa,YAAY;IACvB,OAAO,KAAK,QAAQ,GAEnB;IAEK,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CA2EnD"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NotifyEngine = exports.NOTIFY_LEVELS = void 0;
4
+ const DEFAULT_ENDPOINT = 'http://localhost:8150';
5
+ exports.NOTIFY_LEVELS = ['info', 'warning', 'critical'];
6
+ class NotifyEngine {
7
+ get endpoint() {
8
+ return process.env['CREWX_ENDPOINT'] ?? DEFAULT_ENDPOINT;
9
+ }
10
+ async send(opts) {
11
+ const title = typeof opts.title === 'string' ? opts.title.trim() : '';
12
+ if (!title) {
13
+ throw new Error('notify requires a title.\nUsage: crewx notify "<title>" [--level=info|warning|critical] [--body="..."]');
14
+ }
15
+ const level = opts.level ?? 'info';
16
+ if (!exports.NOTIFY_LEVELS.includes(level)) {
17
+ throw new Error(`Invalid level '${level}'. Must be one of: ${exports.NOTIFY_LEVELS.join(', ')}`);
18
+ }
19
+ const workspace = process.env['CREWX_WORKSPACE'] ?? '';
20
+ if (!workspace) {
21
+ throw new Error('CREWX_WORKSPACE is not set. The notify CLI needs the absolute workspace path to route the notification.');
22
+ }
23
+ const body = {
24
+ workspace,
25
+ title,
26
+ level,
27
+ source: 'agent',
28
+ };
29
+ if (opts.body)
30
+ body['body'] = opts.body;
31
+ const agentId = process.env['CREWX_AGENT_ID'];
32
+ const taskId = process.env['CREWX_TASK_ID'];
33
+ const threadId = process.env['CREWX_THREAD_ID'];
34
+ if (agentId)
35
+ body['agentId'] = agentId;
36
+ if (taskId)
37
+ body['taskId'] = taskId;
38
+ if (threadId)
39
+ body['threadId'] = threadId;
40
+ const endpoint = this.endpoint;
41
+ const apiToken = process.env['CREWX_API_TOKEN'] ?? '';
42
+ const headers = { 'Content-Type': 'application/json' };
43
+ if (apiToken)
44
+ headers['Authorization'] = `Bearer ${apiToken}`;
45
+ let res;
46
+ try {
47
+ res = await fetch(`${endpoint}/api/v1/notifications`, {
48
+ method: 'POST',
49
+ headers,
50
+ body: JSON.stringify(body),
51
+ signal: AbortSignal.timeout(15000),
52
+ });
53
+ }
54
+ catch (err) {
55
+ const msg = err instanceof Error ? err.message : String(err);
56
+ throw new Error(`Server connection failed: ${msg}\nCheck that the server is running (${endpoint})`);
57
+ }
58
+ if (!res.ok) {
59
+ const data = (await res.json().catch(() => ({})));
60
+ if (res.status === 401 || res.status === 403) {
61
+ throw new Error(`Notification rejected (${res.status}): authentication failed. ` +
62
+ 'For a remote server set CREWX_API_TOKEN; localhost needs no token.');
63
+ }
64
+ throw new Error(`Notification failed (${res.status}): ${JSON.stringify(data)}`);
65
+ }
66
+ const payload = (await res.json().catch(() => ({})));
67
+ const id = payload?.data?.id ?? 'unknown';
68
+ return { id };
69
+ }
70
+ }
71
+ exports.NotifyEngine = NotifyEngine;
72
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@crewx/notify",
3
+ "version": "0.1.0-rc.1",
4
+ "description": "Notification CLI for CrewX agents — POST an in-app notification to the dashboard",
5
+ "type": "commonjs",
6
+ "main": "dist/src/engine.js",
7
+ "types": "dist/src/engine.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/src/engine.d.ts",
11
+ "import": "./dist/src/engine.js",
12
+ "require": "./dist/src/engine.js",
13
+ "default": "./dist/src/engine.js"
14
+ },
15
+ "./cli": {
16
+ "import": "./dist/cli.js",
17
+ "require": "./dist/cli.js",
18
+ "default": "./dist/cli.js"
19
+ }
20
+ },
21
+ "bin": {
22
+ "notify": "./dist/cli.js"
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "SKILL.md"
27
+ ],
28
+ "keywords": [
29
+ "crewx",
30
+ "notify",
31
+ "notification"
32
+ ],
33
+ "license": "MIT",
34
+ "dependencies": {
35
+ "@crewx/shared": "0.0.6"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^20.0.0",
39
+ "ts-node": "^10.9.0",
40
+ "typescript": "^5.0.0"
41
+ },
42
+ "scripts": {
43
+ "build": "tsc",
44
+ "dev": "ts-node cli.ts",
45
+ "clean": "rm -rf dist",
46
+ "test": "echo no tests"
47
+ }
48
+ }