alif-fund 0.1.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/LICENSE +21 -0
- package/README.md +130 -0
- package/dist/cli.js +381 -0
- package/dist/worker.js +460 -0
- package/docs/auth.md +50 -0
- package/docs/security.md +22 -0
- package/docs/self-hosting.md +62 -0
- package/examples/claude-code.md +19 -0
- package/examples/codex.md +21 -0
- package/examples/cron.sh +11 -0
- package/examples/github-actions.yml +24 -0
- package/examples/hermes.md +11 -0
- package/migrations/0001_initial.sql +88 -0
- package/migrations/0002_email_otp_auth.sql +21 -0
- package/package.json +49 -0
- package/wrangler.jsonc +35 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS companies (
|
|
2
|
+
id TEXT PRIMARY KEY,
|
|
3
|
+
name TEXT NOT NULL,
|
|
4
|
+
website TEXT,
|
|
5
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
|
|
6
|
+
);
|
|
7
|
+
|
|
8
|
+
CREATE TABLE IF NOT EXISTS founders (
|
|
9
|
+
id TEXT PRIMARY KEY,
|
|
10
|
+
company_id TEXT NOT NULL REFERENCES companies(id),
|
|
11
|
+
email TEXT NOT NULL,
|
|
12
|
+
name TEXT NOT NULL,
|
|
13
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
CREATE TABLE IF NOT EXISTS applications (
|
|
17
|
+
id TEXT PRIMARY KEY,
|
|
18
|
+
company_id TEXT NOT NULL REFERENCES companies(id),
|
|
19
|
+
status TEXT NOT NULL DEFAULT 'submitted',
|
|
20
|
+
narrative_json TEXT NOT NULL,
|
|
21
|
+
submitted_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
CREATE TABLE IF NOT EXISTS api_tokens (
|
|
25
|
+
public_id TEXT PRIMARY KEY,
|
|
26
|
+
token_hash TEXT NOT NULL,
|
|
27
|
+
company_id TEXT NOT NULL REFERENCES companies(id),
|
|
28
|
+
application_id TEXT NOT NULL REFERENCES applications(id),
|
|
29
|
+
name TEXT NOT NULL,
|
|
30
|
+
scopes TEXT NOT NULL,
|
|
31
|
+
allowed_metrics TEXT,
|
|
32
|
+
expires_at TEXT,
|
|
33
|
+
revoked_at TEXT,
|
|
34
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
CREATE TABLE IF NOT EXISTS metrics (
|
|
38
|
+
id TEXT PRIMARY KEY,
|
|
39
|
+
company_id TEXT NOT NULL REFERENCES companies(id),
|
|
40
|
+
key TEXT NOT NULL,
|
|
41
|
+
display_name TEXT NOT NULL,
|
|
42
|
+
unit TEXT NOT NULL,
|
|
43
|
+
cadence TEXT NOT NULL,
|
|
44
|
+
direction TEXT NOT NULL,
|
|
45
|
+
source_type TEXT NOT NULL DEFAULT 'self_reported',
|
|
46
|
+
verification_level TEXT NOT NULL DEFAULT 'self_reported',
|
|
47
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
48
|
+
UNIQUE(company_id, key)
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
CREATE TABLE IF NOT EXISTS metric_points (
|
|
52
|
+
id TEXT PRIMARY KEY,
|
|
53
|
+
metric_id TEXT NOT NULL REFERENCES metrics(id),
|
|
54
|
+
company_id TEXT NOT NULL REFERENCES companies(id),
|
|
55
|
+
timestamp TEXT NOT NULL,
|
|
56
|
+
value REAL NOT NULL,
|
|
57
|
+
source TEXT NOT NULL,
|
|
58
|
+
confidence REAL NOT NULL DEFAULT 0.5,
|
|
59
|
+
raw_event_id TEXT,
|
|
60
|
+
idempotency_key TEXT NOT NULL,
|
|
61
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
62
|
+
UNIQUE(metric_id, idempotency_key)
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
CREATE TABLE IF NOT EXISTS alerts (
|
|
66
|
+
id TEXT PRIMARY KEY,
|
|
67
|
+
company_id TEXT NOT NULL REFERENCES companies(id),
|
|
68
|
+
metric_id TEXT NOT NULL REFERENCES metrics(id),
|
|
69
|
+
alert_type TEXT NOT NULL,
|
|
70
|
+
severity TEXT NOT NULL,
|
|
71
|
+
summary TEXT NOT NULL,
|
|
72
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
CREATE TABLE IF NOT EXISTS audit_log (
|
|
76
|
+
id TEXT PRIMARY KEY,
|
|
77
|
+
company_id TEXT,
|
|
78
|
+
actor TEXT NOT NULL,
|
|
79
|
+
action TEXT NOT NULL,
|
|
80
|
+
resource_type TEXT NOT NULL,
|
|
81
|
+
resource_id TEXT,
|
|
82
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
83
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
CREATE INDEX IF NOT EXISTS idx_metric_points_metric_time ON metric_points(metric_id, timestamp DESC);
|
|
87
|
+
CREATE INDEX IF NOT EXISTS idx_metrics_company_key ON metrics(company_id, key);
|
|
88
|
+
CREATE INDEX IF NOT EXISTS idx_alerts_company_time ON alerts(company_id, created_at DESC);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS email_otps (
|
|
2
|
+
id TEXT PRIMARY KEY,
|
|
3
|
+
email TEXT NOT NULL,
|
|
4
|
+
code_hash TEXT NOT NULL,
|
|
5
|
+
expires_at TEXT NOT NULL,
|
|
6
|
+
consumed_at TEXT,
|
|
7
|
+
attempts INTEGER NOT NULL DEFAULT 0,
|
|
8
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
CREATE TABLE IF NOT EXISTS email_sessions (
|
|
12
|
+
public_id TEXT PRIMARY KEY,
|
|
13
|
+
token_hash TEXT NOT NULL,
|
|
14
|
+
email TEXT NOT NULL,
|
|
15
|
+
expires_at TEXT NOT NULL,
|
|
16
|
+
revoked_at TEXT,
|
|
17
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
CREATE INDEX IF NOT EXISTS idx_email_otps_email_created ON email_otps(email, created_at DESC);
|
|
21
|
+
CREATE INDEX IF NOT EXISTS idx_email_sessions_email ON email_sessions(email);
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "alif-fund",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Apply to Alif from your terminal and let agents update traction metrics.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/alifdotbuild/alifcli.git"
|
|
13
|
+
},
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/alifdotbuild/alifcli/issues"
|
|
16
|
+
},
|
|
17
|
+
"homepage": "https://github.com/alifdotbuild/alifcli#readme",
|
|
18
|
+
"bin": {
|
|
19
|
+
"alif-fund": "dist/cli.js"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"migrations",
|
|
24
|
+
"docs",
|
|
25
|
+
"examples",
|
|
26
|
+
"README.md",
|
|
27
|
+
"LICENSE",
|
|
28
|
+
"wrangler.jsonc"
|
|
29
|
+
],
|
|
30
|
+
"engines": {
|
|
31
|
+
"node": ">=22"
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsc",
|
|
35
|
+
"prepare": "npm run build",
|
|
36
|
+
"prepack": "npm run build",
|
|
37
|
+
"dev": "wrangler dev",
|
|
38
|
+
"deploy": "wrangler deploy",
|
|
39
|
+
"db:migrate:local": "wrangler d1 migrations apply alif-db --local",
|
|
40
|
+
"db:migrate:remote": "wrangler d1 migrations apply alif-db --remote",
|
|
41
|
+
"typecheck": "tsc --noEmit"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@cloudflare/workers-types": "^4.20260605.0",
|
|
45
|
+
"@types/node": "^22.15.29",
|
|
46
|
+
"typescript": "^5.8.3",
|
|
47
|
+
"wrangler": "^4.19.1"
|
|
48
|
+
}
|
|
49
|
+
}
|
package/wrangler.jsonc
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "node_modules/wrangler/config-schema.json",
|
|
3
|
+
"name": "alif-api",
|
|
4
|
+
"main": "src/worker.ts",
|
|
5
|
+
"compatibility_date": "2026-06-01",
|
|
6
|
+
"d1_databases": [
|
|
7
|
+
{
|
|
8
|
+
"binding": "DB",
|
|
9
|
+
"database_name": "alif-db",
|
|
10
|
+
"database_id": "REPLACE_WITH_D1_DATABASE_ID"
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"queues": {
|
|
14
|
+
"producers": [
|
|
15
|
+
{
|
|
16
|
+
"binding": "METRIC_QUEUE",
|
|
17
|
+
"queue": "alif-metric-events"
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"consumers": [
|
|
21
|
+
{
|
|
22
|
+
"queue": "alif-metric-events",
|
|
23
|
+
"max_batch_size": 10,
|
|
24
|
+
"max_batch_timeout": 5
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
"triggers": {
|
|
29
|
+
"crons": ["*/30 * * * *"]
|
|
30
|
+
},
|
|
31
|
+
"vars": {
|
|
32
|
+
"ALIF_ENV": "development",
|
|
33
|
+
"REQUIRE_EMAIL_OTP": "false"
|
|
34
|
+
}
|
|
35
|
+
}
|