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 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 issues --json
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 issues --json | jq '.[] | select(.severity == "critical")'
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** | `issues` | List issues |
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, issues
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 from issue #<id>"
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': ['issues', 'notifications', 'alerts', 'fp'],
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securenow",
3
- "version": "5.17.1",
3
+ "version": "5.18.0",
4
4
  "description": "OpenTelemetry instrumentation for Node.js, Next.js, and Nuxt - Send traces and logs to any OTLP-compatible backend",
5
5
  "type": "commonjs",
6
6
  "main": "register.js",