securenow 5.17.1 → 5.18.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/NPM_README.md +3 -28
- package/README.md +1 -5
- package/SKILL-CLI.md +1 -11
- package/cli/monitor.js +0 -105
- package/cli.js +1 -11
- package/package.json +1 -1
package/NPM_README.md
CHANGED
|
@@ -211,20 +211,6 @@ npx securenow logs --app <key> --minutes 30 --level error
|
|
|
211
211
|
npx securenow logs trace <traceId>
|
|
212
212
|
```
|
|
213
213
|
|
|
214
|
-
### Security Issues
|
|
215
|
-
|
|
216
|
-
```bash
|
|
217
|
-
# List all issues
|
|
218
|
-
npx securenow issues
|
|
219
|
-
npx securenow issues --status open
|
|
220
|
-
|
|
221
|
-
# Show issue details with AI analysis
|
|
222
|
-
npx securenow issues show <issue-id>
|
|
223
|
-
|
|
224
|
-
# Resolve an issue
|
|
225
|
-
npx securenow issues resolve <issue-id>
|
|
226
|
-
```
|
|
227
|
-
|
|
228
214
|
### Notifications
|
|
229
215
|
|
|
230
216
|
```bash
|
|
@@ -382,21 +368,13 @@ You can also use the `SECURENOW_TOKEN` env var for per-terminal sessions without
|
|
|
382
368
|
|
|
383
369
|
```bash
|
|
384
370
|
# Authenticate with a token in CI (env var — no file needed)
|
|
385
|
-
SECURENOW_TOKEN=$MY_SECRET npx securenow
|
|
371
|
+
SECURENOW_TOKEN=$MY_SECRET npx securenow logs --json
|
|
386
372
|
|
|
387
373
|
# Or use login with explicit token
|
|
388
374
|
npx securenow login --token $SECURENOW_TOKEN
|
|
389
375
|
|
|
390
376
|
# Use --json for machine-readable output
|
|
391
|
-
npx securenow
|
|
392
|
-
|
|
393
|
-
# Check for critical issues in a pipeline
|
|
394
|
-
ISSUES=$(npx securenow issues --json --status open)
|
|
395
|
-
CRITICAL=$(echo "$ISSUES" | jq '[.[] | select(.severity == "critical")] | length')
|
|
396
|
-
if [ "$CRITICAL" -gt "0" ]; then
|
|
397
|
-
echo "Found $CRITICAL critical issues!"
|
|
398
|
-
exit 1
|
|
399
|
-
fi
|
|
377
|
+
npx securenow logs --json --level error | jq '.logs'
|
|
400
378
|
```
|
|
401
379
|
|
|
402
380
|
### Complete Command Reference
|
|
@@ -419,10 +397,7 @@ fi
|
|
|
419
397
|
| | `logs trace <id>` | Logs for a trace |
|
|
420
398
|
| | `analytics` | Response analytics |
|
|
421
399
|
| | `status` | Dashboard overview |
|
|
422
|
-
| **Detect** | `
|
|
423
|
-
| | `issues show <id>` | Issue details |
|
|
424
|
-
| | `issues resolve <id>` | Resolve issue |
|
|
425
|
-
| | `notifications` | List notifications |
|
|
400
|
+
| **Detect** | `notifications` | List notifications |
|
|
426
401
|
| | `notifications unread` | Unread count |
|
|
427
402
|
| | `notifications read <id>` | Mark read |
|
|
428
403
|
| | `notifications read-all` | Mark all read |
|
package/README.md
CHANGED
|
@@ -117,10 +117,9 @@ npx securenow apps create my-app
|
|
|
117
117
|
# Set it as default so you don't need --app every time
|
|
118
118
|
npx securenow config set defaultApp <key>
|
|
119
119
|
|
|
120
|
-
# View traces, logs
|
|
120
|
+
# View traces, logs
|
|
121
121
|
npx securenow traces
|
|
122
122
|
npx securenow logs
|
|
123
|
-
npx securenow issues
|
|
124
123
|
|
|
125
124
|
# IP intelligence, forensic queries, blocklist
|
|
126
125
|
npx securenow ip 1.2.3.4
|
|
@@ -295,9 +294,6 @@ Most users won't need this — just add `-r securenow/register` to your existing
|
|
|
295
294
|
|
|
296
295
|
| Command | Description |
|
|
297
296
|
|---------|-------------|
|
|
298
|
-
| `securenow issues` | List security issues |
|
|
299
|
-
| `securenow issues show <id>` | Show issue details and AI analysis |
|
|
300
|
-
| `securenow issues resolve <id>` | Mark an issue as resolved |
|
|
301
297
|
| `securenow notifications` | List notifications |
|
|
302
298
|
| `securenow notifications unread` | Show unread count |
|
|
303
299
|
| `securenow notifications read <id>` | Mark notification as read |
|
package/SKILL-CLI.md
CHANGED
|
@@ -159,15 +159,6 @@ securenow logs list --app my-app --minutes 30 --level error
|
|
|
159
159
|
securenow logs trace <traceId> # logs correlated to a specific trace
|
|
160
160
|
```
|
|
161
161
|
|
|
162
|
-
### Issues
|
|
163
|
-
|
|
164
|
-
```bash
|
|
165
|
-
securenow issues [--app <key>] [--status open|resolved]
|
|
166
|
-
securenow issues list --status open
|
|
167
|
-
securenow issues show <id> # full issue details
|
|
168
|
-
securenow issues resolve <id> # mark as resolved
|
|
169
|
-
```
|
|
170
|
-
|
|
171
162
|
### Notifications
|
|
172
163
|
|
|
173
164
|
```bash
|
|
@@ -342,7 +333,7 @@ securenow ip traces <attacker-ip> --json
|
|
|
342
333
|
securenow traces show <trace-id> --json
|
|
343
334
|
securenow traces analyze <trace-id> --json
|
|
344
335
|
# Decision: block the IP
|
|
345
|
-
securenow blocklist add <attacker-ip> --reason "Automated: SQL injection
|
|
336
|
+
securenow blocklist add <attacker-ip> --reason "Automated: SQL injection detected"
|
|
346
337
|
```
|
|
347
338
|
|
|
348
339
|
#### Notification IP Investigation Statuses
|
|
@@ -387,7 +378,6 @@ securenow status --json
|
|
|
387
378
|
securenow firewall status --json
|
|
388
379
|
securenow blocklist stats --json
|
|
389
380
|
securenow api-map stats --json
|
|
390
|
-
securenow issues list --status open --json
|
|
391
381
|
securenow forensics "summarize all attacks in the last 7 days"
|
|
392
382
|
```
|
|
393
383
|
|
package/cli/monitor.js
CHANGED
|
@@ -292,108 +292,6 @@ async function logsTrace(args, flags) {
|
|
|
292
292
|
}
|
|
293
293
|
}
|
|
294
294
|
|
|
295
|
-
// ── Issues ──
|
|
296
|
-
|
|
297
|
-
async function issuesList(args, flags) {
|
|
298
|
-
requireAuth();
|
|
299
|
-
const s = ui.spinner('Fetching issues');
|
|
300
|
-
try {
|
|
301
|
-
const query = {};
|
|
302
|
-
const appKey = resolveApp(flags);
|
|
303
|
-
if (appKey) query.serviceName = appKey;
|
|
304
|
-
if (flags.status) query.status = flags.status;
|
|
305
|
-
|
|
306
|
-
const data = await api.get('/issues', { query });
|
|
307
|
-
const issues = data.issues || [];
|
|
308
|
-
s.stop(`Found ${issues.length} issue${issues.length !== 1 ? 's' : ''}`);
|
|
309
|
-
|
|
310
|
-
if (flags.json) { ui.json(data); return; }
|
|
311
|
-
|
|
312
|
-
console.log('');
|
|
313
|
-
const rows = issues.map(i => [
|
|
314
|
-
ui.c.dim(ui.truncate(i._id, 12)),
|
|
315
|
-
ui.statusBadge(i.severity || i.level || 'medium'),
|
|
316
|
-
ui.statusBadge(i.status || 'open'),
|
|
317
|
-
ui.truncate(i.title || i.message || i.type || '', 50),
|
|
318
|
-
i.serviceName || '—',
|
|
319
|
-
i.count != null ? String(i.count) : '—',
|
|
320
|
-
ui.timeAgo(i.lastSeen || i.createdAt),
|
|
321
|
-
]);
|
|
322
|
-
|
|
323
|
-
ui.table(['ID', 'Severity', 'Status', 'Title', 'App', 'Count', 'Last Seen'], rows);
|
|
324
|
-
if (data.total != null) {
|
|
325
|
-
console.log(ui.c.dim(` Total: ${data.total}`));
|
|
326
|
-
}
|
|
327
|
-
console.log('');
|
|
328
|
-
} catch (err) {
|
|
329
|
-
s.fail('Failed to fetch issues');
|
|
330
|
-
throw err;
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
async function issuesShow(args, flags) {
|
|
335
|
-
requireAuth();
|
|
336
|
-
const id = args[0];
|
|
337
|
-
if (!id) {
|
|
338
|
-
ui.error('Issue ID required. Usage: securenow issues show <id>');
|
|
339
|
-
process.exit(1);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
const s = ui.spinner('Fetching issue');
|
|
343
|
-
try {
|
|
344
|
-
const data = await api.get(`/issues/${id}`);
|
|
345
|
-
const issue = data.issue || data;
|
|
346
|
-
s.stop('Issue loaded');
|
|
347
|
-
|
|
348
|
-
if (flags.json) { ui.json(issue); return; }
|
|
349
|
-
|
|
350
|
-
console.log('');
|
|
351
|
-
ui.heading(issue.title || issue.type || `Issue ${id}`);
|
|
352
|
-
console.log('');
|
|
353
|
-
ui.keyValue([
|
|
354
|
-
['ID', issue._id],
|
|
355
|
-
['Status', ui.statusBadge(issue.status || 'open')],
|
|
356
|
-
['Severity', ui.statusBadge(issue.severity || issue.level || 'medium')],
|
|
357
|
-
['App', issue.serviceName || '—'],
|
|
358
|
-
['Type', issue.type || '—'],
|
|
359
|
-
['Count', issue.count != null ? String(issue.count) : '—'],
|
|
360
|
-
['First Seen', issue.firstSeen ? new Date(issue.firstSeen).toLocaleString() : '—'],
|
|
361
|
-
['Last Seen', issue.lastSeen ? new Date(issue.lastSeen).toLocaleString() : '—'],
|
|
362
|
-
]);
|
|
363
|
-
|
|
364
|
-
if (issue.message || issue.description) {
|
|
365
|
-
ui.subheading('Description');
|
|
366
|
-
console.log(`\n ${issue.message || issue.description}\n`);
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
if (issue.analysis) {
|
|
370
|
-
ui.subheading('AI Analysis');
|
|
371
|
-
console.log(`\n ${issue.analysis}\n`);
|
|
372
|
-
}
|
|
373
|
-
console.log('');
|
|
374
|
-
} catch (err) {
|
|
375
|
-
s.fail('Failed to fetch issue');
|
|
376
|
-
throw err;
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
async function issuesResolve(args, flags) {
|
|
381
|
-
requireAuth();
|
|
382
|
-
const id = args[0];
|
|
383
|
-
if (!id) {
|
|
384
|
-
ui.error('Issue ID required. Usage: securenow issues resolve <id>');
|
|
385
|
-
process.exit(1);
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
const s = ui.spinner('Resolving issue');
|
|
389
|
-
try {
|
|
390
|
-
await api.patch(`/issues/${id}`, { status: 'resolved' });
|
|
391
|
-
s.stop('Issue resolved');
|
|
392
|
-
} catch (err) {
|
|
393
|
-
s.fail('Failed to resolve issue');
|
|
394
|
-
throw err;
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
295
|
|
|
398
296
|
// ── Notifications ──
|
|
399
297
|
|
|
@@ -534,9 +432,6 @@ module.exports = {
|
|
|
534
432
|
tracesAnalyze,
|
|
535
433
|
logsList,
|
|
536
434
|
logsTrace,
|
|
537
|
-
issuesList,
|
|
538
|
-
issuesShow,
|
|
539
|
-
issuesResolve,
|
|
540
435
|
notificationsList,
|
|
541
436
|
notificationsRead,
|
|
542
437
|
notificationsReadAll,
|
package/cli.js
CHANGED
|
@@ -95,16 +95,6 @@ const COMMANDS = {
|
|
|
95
95
|
},
|
|
96
96
|
defaultSub: 'list',
|
|
97
97
|
},
|
|
98
|
-
issues: {
|
|
99
|
-
desc: 'Manage security issues',
|
|
100
|
-
usage: 'securenow issues <subcommand> [options]',
|
|
101
|
-
sub: {
|
|
102
|
-
list: { desc: 'List issues', flags: { app: 'App key', status: 'Filter by status' }, run: (a, f) => require('./cli/monitor').issuesList(a, f) },
|
|
103
|
-
show: { desc: 'Show issue details', usage: 'securenow issues show <id>', run: (a, f) => require('./cli/monitor').issuesShow(a, f) },
|
|
104
|
-
resolve: { desc: 'Resolve an issue', usage: 'securenow issues resolve <id>', run: (a, f) => require('./cli/monitor').issuesResolve(a, f) },
|
|
105
|
-
},
|
|
106
|
-
defaultSub: 'list',
|
|
107
|
-
},
|
|
108
98
|
notifications: {
|
|
109
99
|
desc: 'Manage notifications',
|
|
110
100
|
usage: 'securenow notifications <subcommand> [options]',
|
|
@@ -362,7 +352,7 @@ function showHelp(commandName) {
|
|
|
362
352
|
'Authentication': ['login', 'logout', 'whoami'],
|
|
363
353
|
'Applications': ['apps', 'init', 'status'],
|
|
364
354
|
'Observe': ['traces', 'logs', 'analytics'],
|
|
365
|
-
'Detect & Respond': ['
|
|
355
|
+
'Detect & Respond': ['notifications', 'alerts', 'fp'],
|
|
366
356
|
'Investigate': ['ip', 'forensics', 'api-map'],
|
|
367
357
|
'Firewall': ['firewall'],
|
|
368
358
|
'Remediation': ['blocklist', 'allowlist', 'trusted'],
|
package/package.json
CHANGED