delimit-cli 3.14.42 → 3.14.43

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.
@@ -4,6 +4,7 @@ Monitors Supabase for new signups, sends welcome emails,
4
4
  tracks slots remaining, and manages the 12-month term.
5
5
  """
6
6
  import json
7
+ import os
7
8
  import smtplib
8
9
  import imaplib
9
10
  from email.mime.text import MIMEText
@@ -22,7 +23,7 @@ EMAIL = "pro@delimit.ai"
22
23
 
23
24
  def _load_creds():
24
25
  """Load email credentials."""
25
- return {"email": EMAIL, "password": "Bladabah3!"}
26
+ return {"email": EMAIL, "password": os.environ.get("DELIMIT_FOUNDING_PASSWORD", "")}
26
27
 
27
28
 
28
29
  def _load_founding_users() -> dict:
@@ -37,7 +37,7 @@ INBOX_ROUTING_FILE = Path.home() / ".delimit" / "inbox_routing.jsonl"
37
37
  IMAP_HOST = "mail.spacemail.com"
38
38
  IMAP_PORT = 993
39
39
  IMAP_USER = "pro@delimit.ai"
40
- FORWARD_TO = "jamsonsholdings@gmail.com"
40
+ FORWARD_TO = os.environ.get("DELIMIT_FORWARD_TO", "")
41
41
 
42
42
  # Domains/senders whose emails require owner action
43
43
  OWNER_ACTION_DOMAINS = {
@@ -61,7 +61,7 @@ OWNER_ACTION_DOMAINS = {
61
61
  }
62
62
 
63
63
  OWNER_ACTION_SENDERS = {
64
- "jamsonsholdings@gmail.com",
64
+ os.environ.get("DELIMIT_FORWARD_TO", ""),
65
65
  }
66
66
 
67
67
  # Subject patterns that indicate owner-action (compiled once)
@@ -222,13 +222,12 @@ def send_email(
222
222
  """Send an email notification via SMTP.
223
223
 
224
224
  Args:
225
- to: Recipient email address. Falls back to DELIMIT_SMTP_TO or
226
- jamsonsholdings@gmail.com.
225
+ to: Recipient email address. Falls back to DELIMIT_SMTP_TO env var.
227
226
  subject: Email subject line.
228
227
  body: Email body text (preferred). Falls back to 'message' for
229
228
  backward compatibility.
230
229
  from_account: Sender account key in ~/.delimit/secrets/smtp-all.json
231
- (e.g. 'pro@delimit.ai', 'admin@wire.report'). If provided, SMTP
230
+ (e.g. 'pro@delimit.ai', '<configured-email>'). If provided, SMTP
232
231
  credentials are loaded from that file instead of env vars.
233
232
  message: Email body text (legacy parameter, use 'body' instead).
234
233
  event_type: Event category for filtering/logging.
@@ -258,7 +257,7 @@ def send_email(
258
257
  smtp_pass = os.environ.get("DELIMIT_SMTP_PASS", "")
259
258
  smtp_from = os.environ.get("DELIMIT_SMTP_FROM", "")
260
259
 
261
- smtp_to = to or os.environ.get("DELIMIT_SMTP_TO", "jamsonsholdings@gmail.com")
260
+ smtp_to = to or os.environ.get("DELIMIT_SMTP_TO", "")
262
261
 
263
262
  if not all([smtp_host, smtp_from, smtp_to]):
264
263
  record = {
@@ -5886,9 +5886,9 @@ def delimit_notify(channel: str = "webhook", message: str = "",
5886
5886
  subject: Subject line (email only). Use [ACTION], [INFO], [ALERT] prefix.
5887
5887
  event_type: Event category for filtering.
5888
5888
  to: Recipient email address (email only). Overrides default DELIMIT_SMTP_TO.
5889
- Send to any address — leave empty for default (jamsonsholdings@gmail.com).
5889
+ Send to any address — leave empty for default (uses DELIMIT_SMTP_TO env var).
5890
5890
  from_account: Sender account key from ~/.delimit/secrets/smtp-all.json
5891
- (e.g. 'pro@delimit.ai', 'admin@wire.report'). Email only.
5891
+ (e.g. 'pro@delimit.ai', '<configured-email>'). Email only.
5892
5892
  """
5893
5893
  from ai.notify import send_notification
5894
5894
  return _with_next_steps("notify", _safe_call(
@@ -5994,7 +5994,7 @@ def delimit_notify_inbox(action: str = "status", limit: int = 10,
5994
5994
  """Check inbound email inbox, classify, and route (Pro).
5995
5995
 
5996
5996
  Polls pro@delimit.ai via IMAP. Classifies emails as owner-action
5997
- (forwards to jamsonsholdings@gmail.com) or non-owner (stays in inbox).
5997
+ (forwards to configured email) or non-owner (stays in inbox).
5998
5998
 
5999
5999
  Args:
6000
6000
  action: 'status' (show inbox state), 'poll' (classify and optionally forward),
@@ -201,87 +201,44 @@ def add_subreddits(venture: str, subreddits: List[str]) -> Dict[str, Any]:
201
201
  return {"venture": venture, "added": new_subs, "total": config["subreddits"][venture]}
202
202
 
203
203
  # -----------------------------------------------------------------------
204
- # Per-venture routing config
204
+ # Per-venture routing config (loaded from ~/.delimit/social_target_ventures.json)
205
205
  # -----------------------------------------------------------------------
206
206
 
207
- VENTURE_CONFIG = {
208
- "delimit": {
209
- "topics": [
210
- "API governance", "breaking changes", "OpenAPI", "API linting",
211
- "MCP server", "MCP tools", "CLAUDE.md", "claude code",
212
- "AI coding", "vibe coding", "semver",
213
- ],
214
- "exclude_terms": ["delimit_ai"],
215
- "owned_accounts": ["delimit_ai", "delimitdev"],
216
- "priority": "P0",
217
- },
218
- "domainvested": {
219
- "topics": [
220
- "domain investing", "domain appraisal", "domain flipping",
221
- "expired domains", "brandable domains", "domain valuation", "NamePros",
222
- ],
223
- "exclude_terms": ["domainvested"],
224
- "owned_accounts": ["domainvested"],
225
- "priority": "P0",
226
- },
227
- "wirereport": {
228
- "topics": [
229
- "sports API", "live sports data", "sports scores API",
230
- "sports news automation",
231
- ],
232
- "exclude_terms": ["wire_report", "wirereport"],
233
- "owned_accounts": ["wirereporthq"],
234
- "priority": "P2",
235
- },
236
- "livetube": {
237
- "topics": [
238
- "live streaming aggregator", "multi-stream",
239
- "twitch alternatives", "live stream discovery",
240
- ],
241
- "exclude_terms": ["livetube"],
242
- "owned_accounts": ["livetube_ai"],
243
- "priority": "P2",
244
- },
245
- "stakeone": {
246
- "topics": [
247
- "Harmony ONE", "harmony validator", "ONE staking",
248
- "harmony blockchain",
249
- ],
250
- "exclude_terms": ["validatorone", "stake_one"],
251
- "owned_accounts": ["validatorone"],
252
- "priority": "P1",
253
- },
254
- }
207
+ _VENTURE_CONFIG_FILE = Path.home() / ".delimit" / "social_target_ventures.json"
255
208
 
256
209
 
257
- # -----------------------------------------------------------------------
258
- # GitHub-specific config
259
- # -----------------------------------------------------------------------
210
+ def _load_venture_config() -> Dict[str, Any]:
211
+ """Load venture config from ~/.delimit/social_target_ventures.json."""
212
+ if _VENTURE_CONFIG_FILE.exists():
213
+ try:
214
+ return json.loads(_VENTURE_CONFIG_FILE.read_text())
215
+ except (json.JSONDecodeError, OSError) as e:
216
+ logger.warning("Failed to load venture config: %s", e)
217
+ return {}
218
+
219
+
220
+ def _load_internal_users() -> set:
221
+ """Load internal usernames from venture config file."""
222
+ config = _load_venture_config()
223
+ return set(config.get("internal_users", []))
260
224
 
261
- VENTURE_GITHUB_QUERIES = {
262
- "delimit": [
263
- "openapi breaking changes",
264
- "API governance CI",
265
- "MCP server claude code",
266
- "API linting github action",
267
- ],
268
- "domainvested": [
269
- "domain appraisal tool",
270
- "domain valuation API",
271
- ],
272
- "stakeone": [
273
- "harmony one validator",
274
- "harmony staking",
275
- ],
276
- }
277
225
 
278
- OWN_REPOS = [
279
- "delimit-ai/delimit-mcp-server",
280
- "delimit-ai/delimit-action",
281
- "delimit-ai/delimit-quickstart",
282
- ]
226
+ def _load_github_queries() -> Dict[str, List[str]]:
227
+ """Load GitHub queries from venture config file."""
228
+ config = _load_venture_config()
229
+ return config.get("github_queries", {})
283
230
 
284
- INTERNAL_USERS = {"infracore", "crypttrx"}
231
+
232
+ def _load_own_repos() -> List[str]:
233
+ """Load own repo list from venture config file."""
234
+ config = _load_venture_config()
235
+ return config.get("own_repos", [])
236
+
237
+
238
+ VENTURE_CONFIG = _load_venture_config().get("ventures", {})
239
+ VENTURE_GITHUB_QUERIES = _load_github_queries()
240
+ OWN_REPOS = _load_own_repos()
241
+ INTERNAL_USERS = _load_internal_users()
285
242
 
286
243
 
287
244
  # -----------------------------------------------------------------------
@@ -1002,15 +959,6 @@ def _get_rapidapi_key() -> str:
1002
959
  return data.get("value", "")
1003
960
  except Exception:
1004
961
  pass
1005
- # Fallback: wire report env
1006
- wr_env = Path("/home/jamsons/ventures/wire-report/.wr_env")
1007
- if wr_env.exists():
1008
- try:
1009
- for line in wr_env.read_text().splitlines():
1010
- if line.startswith("RAPIDAPI_KEY="):
1011
- return line.split("=", 1)[1].strip()
1012
- except Exception:
1013
- pass
1014
962
  return os.environ.get("RAPIDAPI_KEY", "")
1015
963
 
1016
964
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "delimit-cli",
3
3
  "mcpName": "io.github.delimit-ai/delimit-mcp-server",
4
- "version": "3.14.42",
4
+ "version": "3.14.43",
5
5
  "description": "Unify Claude Code, Codex, Cursor, and Gemini CLI with persistent context, governance, and multi-model debate.",
6
6
  "main": "index.js",
7
7
  "files": [