securenow 8.12.3 → 8.12.4

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.
@@ -2,9 +2,10 @@
2
2
 
3
3
  // `securenow threat-model <category>` — print the copy-paste threat-modeling prompt for a category,
4
4
  // fetched from the published set at securenow.ai (the same prompt shown on securenow.ai/threat-modeling).
5
- // Pipe it straight into your coding agent:
6
- // claude -p "$(npx securenow threat-model authentication)"
7
- // or save it: npx securenow threat-model authentication --out prompt.md
5
+ // Save it and have your coding agent follow the file (prompts run to ~136 KB, over
6
+ // Linux's 128 KB single-argument limit, so `claude -p "$(...)"` fails):
7
+ // npx securenow threat-model authentication --out threat-prompt.md
8
+ // or pipe it on stdin: npx securenow threat-model authentication | claude -p
8
9
  const fs = require('fs');
9
10
  const ui = require('./ui');
10
11
 
@@ -34,8 +35,9 @@ function listCategories() {
34
35
  console.log(' Copy-paste a prompt into your coding agent, or run it with the SecureNow CLI.\n');
35
36
  for (const slug of CATEGORIES) console.log(' ' + slug);
36
37
  console.log('\n Print one: securenow threat-model authentication');
37
- console.log(' Pipe it: claude -p "$(securenow threat-model authentication)"');
38
- console.log(' Save it: securenow threat-model authentication --out prompt.md');
38
+ console.log(' Save it: securenow threat-model authentication --out threat-prompt.md');
39
+ console.log(' then tell your agent: "Follow threat-prompt.md"');
40
+ console.log(' Pipe it: securenow threat-model authentication | claude -p');
39
41
  console.log(' On the web: securenow.ai/threat-modeling');
40
42
  }
41
43
 
package/mcp/catalog.js CHANGED
@@ -1852,6 +1852,54 @@ const TOOLS = [
1852
1852
  },
1853
1853
  ];
1854
1854
 
1855
+ // Annotation policy, matching how Claude's and ChatGPT's directory reviews read
1856
+ // the hints: a write is destructive when it removes or overwrites something,
1857
+ // or can stop production traffic or detection, even if it can be undone. Pure
1858
+ // record-keeping writes (reports, queue closures, read markers, dry runs) are
1859
+ // not. Only tools that reach arbitrary public entities are open-world.
1860
+ const DESTRUCTIVE_TOOLS = new Set([
1861
+ 'securenow_firewall_enable',
1862
+ 'securenow_firewall_disable',
1863
+ 'securenow_firewall_set_threshold',
1864
+ 'securenow_human_action_block',
1865
+ 'securenow_human_action_false_positive',
1866
+ 'securenow_human_case_action_update',
1867
+ 'securenow_automation_defaults_ensure',
1868
+ 'securenow_automation_rule_create',
1869
+ 'securenow_automation_rule_update',
1870
+ 'securenow_automation_rule_execute',
1871
+ 'securenow_automation_rule_delete',
1872
+ 'securenow_rate_limit_remove',
1873
+ 'securenow_rate_limit_create_from_text',
1874
+ 'securenow_alert_rule_rollback',
1875
+ 'securenow_alert_rule_update',
1876
+ 'securenow_alert_rule_query_update',
1877
+ 'securenow_alert_rule_instant_update',
1878
+ 'securenow_alert_rule_condition_update',
1879
+ 'securenow_alert_rule_exclusion_add',
1880
+ 'securenow_alert_rule_exclusion_remove',
1881
+ 'securenow_blocklist_pending_approve',
1882
+ 'securenow_blocklist_pending_reject',
1883
+ 'securenow_blocklist_pending_bulk_approve',
1884
+ 'securenow_blocklist_pending_bulk_reject',
1885
+ 'securenow_blocklist_add',
1886
+ 'securenow_blocklist_remove',
1887
+ 'securenow_blocklist_unblock',
1888
+ 'securenow_allowlist_add',
1889
+ 'securenow_allowlist_remove',
1890
+ 'securenow_trusted_add',
1891
+ 'securenow_trusted_remove',
1892
+ ]);
1893
+
1894
+ const OPEN_WORLD_TOOLS = new Set([
1895
+ 'securenow_ip_lookup', // reputation of any public IP address
1896
+ ]);
1897
+
1898
+ for (const tool of TOOLS) {
1899
+ if (DESTRUCTIVE_TOOLS.has(tool.name)) tool.destructive = true;
1900
+ tool.openWorld = OPEN_WORLD_TOOLS.has(tool.name);
1901
+ }
1902
+
1855
1903
  const RESOURCES = [
1856
1904
  {
1857
1905
  uri: 'securenow://docs/skill-api',
@@ -2247,10 +2295,11 @@ function mcpToolDefinition(tool) {
2247
2295
  inputSchema: tool.inputSchema || objectSchema({}),
2248
2296
  annotations: {
2249
2297
  readOnlyHint: !!tool.readOnly,
2250
- destructiveHint: !!tool.destructive,
2298
+ destructiveHint: !tool.readOnly && !!tool.destructive,
2251
2299
  idempotentHint: !!tool.readOnly,
2252
- },
2253
- };
2300
+ openWorldHint: !!tool.openWorld,
2301
+ },
2302
+ };
2254
2303
  }
2255
2304
 
2256
2305
  function listTools() {
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "securenow",
3
- "version": "8.12.3",
3
+ "version": "8.12.4",
4
+ "mcpName": "ai.securenow/securenow",
4
5
  "description": "OpenTelemetry instrumentation for Node.js, Next.js, and Nuxt - Send traces and logs to any OTLP-compatible backend",
5
6
  "type": "commonjs",
6
7
  "main": "register.js",