opmsec 0.1.3 → 0.1.5

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.
Files changed (166) hide show
  1. package/.env.example +1 -0
  2. package/.husky/pre-commit +1 -0
  3. package/README.md +71 -275
  4. package/bun.lock +5 -5
  5. package/docs/architecture/agents.mdx +11 -59
  6. package/docs/architecture/benchmarks.mdx +20 -46
  7. package/docs/architecture/overview.mdx +31 -38
  8. package/docs/architecture/scanner.mdx +11 -37
  9. package/docs/cli/audit.mdx +9 -12
  10. package/docs/cli/check.mdx +12 -26
  11. package/docs/cli/fix.mdx +10 -30
  12. package/docs/cli/info.mdx +12 -19
  13. package/docs/cli/install.mdx +27 -39
  14. package/docs/cli/push.mdx +40 -57
  15. package/docs/cli/register-agent.mdx +21 -53
  16. package/docs/cli/view.mdx +12 -29
  17. package/docs/concepts/ens-records.mdx +44 -0
  18. package/docs/concepts/multi-agent-consensus.mdx +18 -36
  19. package/docs/concepts/on-chain-registry.mdx +22 -49
  20. package/docs/concepts/security-model.mdx +20 -52
  21. package/docs/concepts/zk-agent-verification.mdx +26 -64
  22. package/docs/contract/events.mdx +13 -74
  23. package/docs/contract/functions.mdx +40 -126
  24. package/docs/contract/overview.mdx +17 -36
  25. package/docs/introduction.mdx +22 -25
  26. package/docs/mint.json +3 -2
  27. package/docs/quickstart.mdx +34 -70
  28. package/docs/system-design.png +0 -0
  29. package/package.json +7 -6
  30. package/packages/cli/src/commands/author-view.tsx +87 -2
  31. package/packages/cli/src/commands/check.tsx +18 -5
  32. package/packages/cli/src/commands/fix.tsx +25 -12
  33. package/packages/cli/src/commands/info.tsx +92 -4
  34. package/packages/cli/src/commands/install.tsx +327 -23
  35. package/packages/cli/src/commands/push.tsx +112 -0
  36. package/packages/cli/src/commands/register-agent.tsx +72 -31
  37. package/packages/cli/src/index.tsx +7 -5
  38. package/packages/cli/src/services/ens-records.ts +525 -0
  39. package/packages/cli/src/services/version.ts +156 -5
  40. package/packages/core/src/benchmarks.ts +116 -0
  41. package/packages/core/src/constants.ts +18 -6
  42. package/packages/core/src/model-rankings.ts +40 -15
  43. package/packages/core/src/types.ts +10 -0
  44. package/packages/core/src/utils.ts +136 -1
  45. package/packages/scanner/src/index.ts +2 -1
  46. package/packages/scanner/src/queue/memory-queue.ts +7 -2
  47. package/packages/scanner/src/services/benchmark-runner.ts +86 -1
  48. package/packages/scanner/src/services/fileverse.ts +61 -12
  49. package/packages/scanner/src/services/openrouter.ts +18 -7
  50. package/packages/web/.next/BUILD_ID +1 -0
  51. package/packages/web/.next/app-path-routes-manifest.json +4 -0
  52. package/packages/web/.next/diagnostics/build-diagnostics.json +6 -0
  53. package/packages/web/.next/diagnostics/framework.json +1 -0
  54. package/packages/web/.next/export-marker.json +6 -0
  55. package/packages/web/.next/images-manifest.json +58 -0
  56. package/packages/web/.next/next-minimal-server.js.nft.json +1 -0
  57. package/packages/web/.next/next-server.js.nft.json +1 -0
  58. package/packages/web/.next/prerender-manifest.json +54 -4
  59. package/packages/web/.next/required-server-files.json +320 -0
  60. package/packages/web/.next/routes-manifest.json +53 -1
  61. package/packages/web/.next/server/app/_not-found/page.js +2 -0
  62. package/packages/web/.next/server/app/_not-found/page.js.nft.json +1 -0
  63. package/packages/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  64. package/packages/web/.next/server/app/_not-found.html +1 -0
  65. package/packages/web/.next/server/app/_not-found.meta +8 -0
  66. package/packages/web/.next/server/app/_not-found.rsc +18 -0
  67. package/packages/web/.next/server/app/index.html +6 -0
  68. package/packages/web/.next/server/app/index.meta +7 -0
  69. package/packages/web/.next/server/app/index.rsc +22 -0
  70. package/packages/web/.next/server/app/page.js +24 -24
  71. package/packages/web/.next/server/app/page.js.nft.json +1 -0
  72. package/packages/web/.next/server/app/page_client-reference-manifest.js +1 -1
  73. package/packages/web/.next/server/chunks/611.js +6 -0
  74. package/packages/web/.next/server/chunks/778.js +30 -0
  75. package/packages/web/.next/server/functions-config-manifest.json +4 -0
  76. package/packages/web/.next/server/interception-route-rewrite-manifest.js +1 -1
  77. package/packages/web/.next/server/next-font-manifest.js +1 -1
  78. package/packages/web/.next/server/next-font-manifest.json +1 -1
  79. package/packages/web/.next/server/pages/404.html +1 -0
  80. package/packages/web/.next/server/pages/500.html +1 -0
  81. package/packages/web/.next/server/pages/_app.js +1 -0
  82. package/packages/web/.next/server/pages/_app.js.nft.json +1 -0
  83. package/packages/web/.next/server/pages/_document.js +1 -0
  84. package/packages/web/.next/server/pages/_document.js.nft.json +1 -0
  85. package/packages/web/.next/server/pages/_error.js +19 -0
  86. package/packages/web/.next/server/pages/_error.js.nft.json +1 -0
  87. package/packages/web/.next/server/webpack-runtime.js +2 -2
  88. package/packages/web/.next/static/0esGzFBCzREfVwijEGDfL/_buildManifest.js +1 -0
  89. package/packages/web/.next/static/0esGzFBCzREfVwijEGDfL/_ssgManifest.js +1 -0
  90. package/packages/web/.next/static/chunks/174-5b5efcb3b8efcc01.js +1 -0
  91. package/packages/web/.next/static/chunks/255-0dc49b7a6e8e5c05.js +1 -0
  92. package/packages/web/.next/static/chunks/4bd1b696-382748cc942d8a14.js +1 -0
  93. package/packages/web/.next/static/chunks/app/_not-found/page-0da542be7eb33a64.js +1 -0
  94. package/packages/web/.next/static/chunks/app/layout-de8e841104500505.js +1 -0
  95. package/packages/web/.next/static/chunks/app/layout.js +37 -7
  96. package/packages/web/.next/static/chunks/app/page-7e086379698b9fb0.js +1 -0
  97. package/packages/web/.next/static/chunks/app/page.js +297 -1
  98. package/packages/web/.next/static/chunks/framework-ac73abd125e371fe.js +1 -0
  99. package/packages/web/.next/static/chunks/main-4e8d71b5ef7ee7e3.js +1 -0
  100. package/packages/web/.next/static/chunks/main-app-dd261207182e5a23.js +1 -0
  101. package/packages/web/.next/static/chunks/pages/_app-7d307437aca18ad4.js +1 -0
  102. package/packages/web/.next/static/chunks/pages/_error-cb2a52f75f2162e2.js +1 -0
  103. package/packages/web/.next/static/chunks/webpack-0dcd67569eb46132.js +1 -0
  104. package/packages/web/.next/static/chunks/webpack.js +2 -2
  105. package/packages/web/.next/static/css/102562cf2d0ae9b0.css +3 -0
  106. package/packages/web/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  107. package/packages/web/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  108. package/packages/web/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  109. package/packages/web/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  110. package/packages/web/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  111. package/packages/web/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  112. package/packages/web/.next/static/webpack/16f18baa938a434c.webpack.hot-update.json +1 -0
  113. package/packages/web/.next/static/webpack/5fe9fe8578f9c3d2.webpack.hot-update.json +1 -0
  114. package/packages/web/.next/static/webpack/73c7d02260cc80e4.webpack.hot-update.json +1 -0
  115. package/packages/web/.next/static/webpack/a2d85d19aa028de1.webpack.hot-update.json +1 -0
  116. package/packages/web/.next/static/webpack/app/{layout.73e341375c8d429e.hot-update.js → layout.16f18baa938a434c.hot-update.js} +1 -1
  117. package/packages/web/.next/static/webpack/app/{layout.6fee6306e0f98869.hot-update.js → layout.5fe9fe8578f9c3d2.hot-update.js} +1 -1
  118. package/packages/web/.next/static/webpack/app/layout.653e365406c0d9ac.hot-update.js +22 -0
  119. package/packages/web/.next/static/webpack/app/layout.6800169a899e3a8b.hot-update.js +22 -0
  120. package/packages/web/.next/static/webpack/app/layout.73c7d02260cc80e4.hot-update.js +22 -0
  121. package/packages/web/.next/static/webpack/app/layout.a2d85d19aa028de1.hot-update.js +22 -0
  122. package/packages/web/.next/static/webpack/app/page.653e365406c0d9ac.hot-update.js +22 -0
  123. package/packages/web/.next/static/webpack/app/page.6800169a899e3a8b.hot-update.js +22 -0
  124. package/packages/web/.next/static/webpack/app/page.73c7d02260cc80e4.hot-update.js +22 -0
  125. package/packages/web/.next/static/webpack/app/page.a2d85d19aa028de1.hot-update.js +22 -0
  126. package/packages/web/.next/static/webpack/{webpack.6fee6306e0f98869.hot-update.js → webpack.16f18baa938a434c.hot-update.js} +2 -2
  127. package/packages/web/.next/static/webpack/{webpack.73e341375c8d429e.hot-update.js → webpack.5fe9fe8578f9c3d2.hot-update.js} +2 -2
  128. package/packages/web/.next/static/webpack/webpack.653e365406c0d9ac.hot-update.js +12 -0
  129. package/packages/web/.next/static/webpack/webpack.6800169a899e3a8b.hot-update.js +12 -0
  130. package/packages/web/.next/static/webpack/webpack.73c7d02260cc80e4.hot-update.js +12 -0
  131. package/packages/web/.next/static/webpack/webpack.a2d85d19aa028de1.hot-update.js +12 -0
  132. package/packages/web/.next/trace +2 -5
  133. package/packages/web/app/globals.css +197 -51
  134. package/packages/web/app/layout.tsx +6 -3
  135. package/packages/web/app/page.tsx +791 -309
  136. package/packages/web/bun.lock +66 -105
  137. package/packages/web/next.config.ts +8 -1
  138. package/packages/web/package.json +5 -2
  139. package/packages/web/postcss.config.mjs +2 -2
  140. package/packages/web/public/apple-icon.png +1 -0
  141. package/packages/web/public/dependency-bottleneck.png +0 -0
  142. package/packages/web/public/icon-dark-32x32.png +1 -0
  143. package/packages/web/public/icon-light-32x32.png +1 -0
  144. package/packages/web/public/icon.svg +1 -0
  145. package/packages/web/public/nextjs-cve-announcement.png +0 -0
  146. package/packages/web/public/phantomraven-npm-attack.png +0 -0
  147. package/packages/web/public/placeholder-logo.png +1 -0
  148. package/packages/web/public/placeholder-logo.svg +1 -0
  149. package/packages/web/public/placeholder-user.jpg +1 -0
  150. package/packages/web/public/placeholder.jpg +1 -0
  151. package/packages/web/public/placeholder.svg +1 -0
  152. package/packages/web/public/react-cve-meme.png +0 -0
  153. package/packages/web/public/wallet-drain-exploit.png +0 -0
  154. package/packages/web/styles/globals.css +125 -0
  155. package/packages/web/.next/server/vendor-chunks/@swc.js +0 -55
  156. package/packages/web/.next/server/vendor-chunks/next.js +0 -3010
  157. package/packages/web/.next/static/chunks/app-pages-internals.js +0 -182
  158. package/packages/web/.next/static/chunks/main-app.js +0 -1882
  159. package/packages/web/.next/static/css/app/layout.css +0 -1237
  160. package/packages/web/.next/static/webpack/633457081244afec._.hot-update.json +0 -1
  161. package/packages/web/.next/static/webpack/app/page.6fee6306e0f98869.hot-update.js +0 -22
  162. package/packages/web/.next/static/webpack/app/page.73e341375c8d429e.hot-update.js +0 -22
  163. package/packages/web/tailwind.config.ts +0 -48
  164. /package/packages/web/.next/static/chunks/{polyfills.js → polyfills-42372ed130431b0a.js} +0 -0
  165. /package/packages/web/.next/static/webpack/{6fee6306e0f98869.webpack.hot-update.json → 653e365406c0d9ac.webpack.hot-update.json} +0 -0
  166. /package/packages/web/.next/static/webpack/{73e341375c8d429e.webpack.hot-update.json → 6800169a899e3a8b.webpack.hot-update.json} +0 -0
@@ -1,358 +1,840 @@
1
- 'use client';
1
+ "use client"
2
2
 
3
- import { useEffect, useState } from 'react';
3
+ import { useEffect, useState } from "react"
4
+ import { Copy, Check } from "lucide-react"
5
+ import Image from "next/image"
4
6
 
5
- const DOCS_URL = 'http://localhost:3001';
6
- const GITHUB_URL = 'https://github.com/dhananjaypai08/opm';
7
- const NPM_URL = 'https://www.npmjs.com/package/opmsec';
8
- const CONTRACT = '0x16684391fc9bf48246B08Afe16d1a57BFa181d48';
7
+ const DOCS_URL = process.env.NEXT_PUBLIC_DOCS_URL || "https://docs.opm.dev";
8
+ const GITHUB_URL = "https://github.com/dhananjaypai08/opm";
9
+ const NPM_URL = "https://www.npmjs.com/package/opmsec";
10
+ const CONTRACT = "0x16684391fc9bf48246B08Afe16d1a57BFa181d48";
9
11
  const BASESCAN = `https://sepolia.basescan.org/address/${CONTRACT}`;
10
12
 
11
- function Logo({ size = 20 }: { size?: number }) {
12
- return (
13
- <svg viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg" width={size} height={size}>
14
- <rect width="32" height="32" rx="6" fill="#ededed" />
15
- <path d="M8 10L12 22L16 13L20 22L24 10" stroke="#0a0a0a" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
16
- <circle cx="16" cy="24" r="1.5" fill="#16a34a" />
17
- </svg>
18
- );
19
- }
20
-
21
- function Nav() {
22
- const [scrolled, setScrolled] = useState(false);
23
- useEffect(() => {
24
- const handler = () => setScrolled(window.scrollY > 20);
25
- window.addEventListener('scroll', handler, { passive: true });
26
- return () => window.removeEventListener('scroll', handler);
27
- }, []);
28
-
29
- return (
30
- <nav className={`fixed top-0 left-0 right-0 z-40 transition-all duration-300 ${scrolled ? 'bg-bg/80 backdrop-blur-xl border-b border-border' : ''}`}>
31
- <div className="max-w-6xl mx-auto px-6 h-16 flex items-center justify-between">
32
- <a href="/" className="flex items-center gap-2.5 hover:opacity-80 transition-opacity">
33
- <Logo size={24} />
34
- <span className="text-lg font-semibold tracking-tight">opm</span>
35
- <span className="text-[10px] font-mono text-muted bg-surface px-1.5 py-0.5 rounded border border-border">v0.1.3</span>
36
- </a>
37
- <div className="flex items-center gap-8">
38
- <a href="#features" className="text-sm text-muted hover:text-accent transition-colors">Features</a>
39
- <a href="#architecture" className="text-sm text-muted hover:text-accent transition-colors">Architecture</a>
40
- <a href="#cli" className="text-sm text-muted hover:text-accent transition-colors">CLI</a>
41
- <a href={DOCS_URL} target="_blank" rel="noopener" className="text-sm text-muted hover:text-accent transition-colors">Docs</a>
42
- <a href={GITHUB_URL} target="_blank" rel="noopener" className="text-sm text-muted hover:text-accent transition-colors">GitHub</a>
43
- <a href={BASESCAN} target="_blank" rel="noopener" className="text-sm font-mono text-muted hover:text-accent transition-colors flex items-center gap-1.5">
44
- <span className="w-1.5 h-1.5 rounded-full bg-green-500 animate-pulse" />
45
- Base Sepolia
46
- </a>
47
- </div>
48
- </div>
49
- </nav>
50
- );
51
- }
52
-
53
- function Hero() {
54
- return (
55
- <section className="relative min-h-screen flex items-center justify-center grid-bg overflow-hidden">
56
- <div className="absolute inset-0">
57
- <div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[800px] h-[800px] rounded-full bg-gradient-radial from-white/[0.02] to-transparent animate-glow-pulse" />
58
- </div>
59
-
60
- <div className="relative z-10 max-w-4xl mx-auto px-6 text-center">
61
- <div className="animate-fade-in">
62
- <div className="inline-flex items-center gap-2 text-xs font-mono text-muted mb-8 px-3 py-1.5 rounded-full border border-border bg-surface/50">
63
- <span className="w-1.5 h-1.5 rounded-full bg-green-500" />
64
- Secured by multi-agent consensus on Base L2
65
- </div>
66
- </div>
67
-
68
- <h1 className="text-6xl md:text-8xl font-bold tracking-tighter leading-[0.9] mb-6 animate-slide-up" style={{ animationDelay: '0.1s', animationFillMode: 'backwards' }}>
69
- On-chain<br />
70
- <span className="text-transparent bg-clip-text bg-gradient-to-r from-white via-white/90 to-white/40">
71
- Package Security
72
- </span>
73
- </h1>
74
-
75
- <p className="text-lg md:text-xl text-muted max-w-2xl mx-auto mb-12 leading-relaxed animate-slide-up" style={{ animationDelay: '0.3s', animationFillMode: 'backwards' }}>
76
- Cryptographic attestation, multi-model AI auditing, and immutable risk scoring for every npm package. All verified on-chain.
77
- </p>
78
-
79
- <div className="flex flex-col sm:flex-row items-center justify-center gap-4 animate-slide-up" style={{ animationDelay: '0.5s', animationFillMode: 'backwards' }}>
80
- <div className="group relative">
81
- <div className="absolute -inset-0.5 bg-gradient-to-r from-white/20 to-white/5 rounded-lg opacity-0 group-hover:opacity-100 transition-opacity blur-sm" />
82
- <code className="relative flex items-center gap-3 bg-surface border border-border rounded-lg px-5 py-3 font-mono text-sm cursor-pointer hover:border-border-light transition-colors">
83
- <span className="text-muted">$</span>
84
- <span>npm i -g opmsec</span>
85
- <span className="text-muted/50">|</span>
86
- <span className="text-muted text-xs">then: opm install {'<pkg>'}</span>
87
- </code>
88
- </div>
89
- <a href={DOCS_URL} target="_blank" rel="noopener" className="px-5 py-3 text-sm font-medium text-bg bg-accent rounded-lg hover:bg-white transition-colors">
90
- Read the docs
91
- </a>
92
- </div>
93
- </div>
13
+ export default function OPMTerminal() {
14
+ const [currentCommand, setCurrentCommand] = useState(0)
15
+ const [showCursor, setShowCursor] = useState(true)
16
+ const [matrixChars, setMatrixChars] = useState<string[]>([])
17
+ const [terminalLines, setTerminalLines] = useState<string[]>([])
18
+ const [currentTyping, setCurrentTyping] = useState("")
19
+ const [isExecuting, setIsExecuting] = useState(false)
20
+ const [copiedStates, setCopiedStates] = useState<{ [key: string]: boolean }>({})
94
21
 
95
- <div className="absolute bottom-0 left-0 right-0 h-32 bg-gradient-to-t from-bg to-transparent" />
96
- </section>
97
- );
98
- }
22
+ const copyToClipboard = async (text: string, key: string) => {
23
+ try {
24
+ await navigator.clipboard.writeText(text)
25
+ setCopiedStates((prev) => ({ ...prev, [key]: true }))
26
+ setTimeout(() => {
27
+ setCopiedStates((prev) => ({ ...prev, [key]: false }))
28
+ }, 2000)
29
+ } catch (err) {
30
+ console.error("Failed to copy text: ", err)
31
+ }
32
+ }
99
33
 
100
- function Features() {
101
- const features = [
102
- {
103
- title: 'Multi-Agent Consensus',
104
- description: 'Three independent LLMs (Claude, Gemini, DeepSeek) analyze every package in parallel. Risk scores are intelligence-weighted using live Artificial Analysis benchmarks.',
105
- detail: 'No single model failure point. Weighted aggregate scoring with model intelligence and coding indices.',
106
- icon: '⬡',
107
- },
108
- {
109
- title: 'Cryptographic Attestation',
110
- description: 'Every package is checksummed, signed with the author\'s wallet, and registered on Base L2. Signatures are verified at install time.',
111
- detail: 'SHA-256 checksum, ECDSA signature, on-chain registration. Tamper-evident by design.',
112
- icon: '◈',
113
- },
34
+ const terminalSequences = [
114
35
  {
115
- title: 'ZK-Verified Agent Registration',
116
- description: 'Permissionless agent onboarding with zero-knowledge proof of benchmark accuracy. Agents must achieve 100% on labeled security datasets to participate.',
117
- detail: 'Hash-commitment scheme with circom circuit reference. Accuracy proven without revealing test data.',
118
- icon: '◎',
36
+ command: "opm install package-name@djpai.eth",
37
+ outputs: [
38
+ "🔍 Resolving djpai.eth 0x3a9f...c4e2",
39
+ "📦 package-name@1.2.0 — on-chain score: 12 (LOW)",
40
+ "✅ Signature verified · checksum matched",
41
+ "🛡️ Installed securely via OPM",
42
+ ],
119
43
  },
120
44
  {
121
- title: 'On-chain Risk Registry',
122
- description: 'Immutable risk scores, author profiles, and audit reports stored on Base Sepolia. Every security assessment is a verifiable public record.',
123
- detail: 'OPMRegistry.sol: authorizedAgents, packages, versionData, AgentScores. Fully queryable.',
124
- icon: '▣',
45
+ command: "opm push",
46
+ outputs: [
47
+ "📝 Signing with author wallet...",
48
+ "🤖 Agent 1 (Claude) scanning... risk: 8",
49
+ "🤖 Agent 2 (Gemini) scanning... risk: 11",
50
+ "🤖 Agent 3 (DeepSeek) scanning... risk: 6",
51
+ "⛓ Registered on Base Sepolia ✓",
52
+ ],
125
53
  },
126
54
  {
127
- title: 'CVE + Typosquat Detection',
128
- description: 'OSV database integration for known vulnerabilities. Levenshtein-distance typosquat detection against the top 10,000 npm packages.',
129
- detail: 'Real-time CVE lookups, automated fix suggestions, dependency confusion detection.',
130
- icon: '◬',
55
+ command: "opm register-agent --name sentinel --model gpt-5.4",
56
+ outputs: [
57
+ "🧪 Batch benchmark (10 cases, single call)...",
58
+ "✅ Accuracy: 10/10 (100%)",
59
+ "🔐 ZK proof generated & verified",
60
+ "⛓ Agent registered on-chain ✓",
61
+ ],
131
62
  },
132
- {
133
- title: 'Drop-in npm Replacement',
134
- description: 'Full CLI compatibility: install, audit, check, push, fix. Every npm command works transparently with security verification layered on top.',
135
- detail: 'opm install = npm install + on-chain verification + signature check + CVE scan.',
136
- icon: '◯',
137
- },
138
- ];
63
+ ]
64
+
65
+ const heroAsciiText = `
66
+ ██████╗ ██████╗ ███╗ ███╗
67
+ ██╔═══██╗██╔══██╗████╗ ████║
68
+ ██║ ██║██████╔╝██╔████╔██║
69
+ ██║ ██║██╔═══╝ ██║╚██╔╝██║
70
+ ╚██████╔╝██║ ██║ ╚═╝ ██║
71
+ ╚═════╝ ╚═╝ ╚═╝ ╚═╝`.trim()
72
+
73
+ useEffect(() => {
74
+ const chars = "OPM01010101ABCDEF█▓▒░▄▀■□▪▫⛓🔐".split("")
75
+ const newMatrixChars = Array.from({ length: 100 }, () => chars[Math.floor(Math.random() * chars.length)])
76
+ setMatrixChars(newMatrixChars)
77
+
78
+ const interval = setInterval(() => {
79
+ setMatrixChars((prev) => prev.map(() => chars[Math.floor(Math.random() * chars.length)]))
80
+ }, 1500)
81
+
82
+ return () => clearInterval(interval)
83
+ }, [])
84
+
85
+ useEffect(() => {
86
+ const interval = setInterval(() => {
87
+ setShowCursor((prev) => !prev)
88
+ }, 500)
89
+ return () => clearInterval(interval)
90
+ }, [])
91
+
92
+ useEffect(() => {
93
+ const sequence = terminalSequences[currentCommand]
94
+ const timeouts: NodeJS.Timeout[] = []
95
+
96
+ const runSequence = async () => {
97
+ setTerminalLines([])
98
+ setCurrentTyping("")
99
+ setIsExecuting(false)
100
+
101
+ const command = sequence.command
102
+ for (let i = 0; i <= command.length; i++) {
103
+ timeouts.push(
104
+ setTimeout(() => {
105
+ setCurrentTyping(command.slice(0, i))
106
+ }, i * 50),
107
+ )
108
+ }
109
+
110
+ timeouts.push(
111
+ setTimeout(() => {
112
+ setIsExecuting(true)
113
+ setCurrentTyping("")
114
+ setTerminalLines((prev) => [...prev, `user@dev:~/project$ ${command}`])
115
+ }, command.length * 50 + 500),
116
+ )
117
+
118
+ sequence.outputs.forEach((output, index) => {
119
+ timeouts.push(
120
+ setTimeout(() => {
121
+ setTerminalLines((prev) => [...prev, output])
122
+ }, command.length * 50 + 1000 + index * 800),
123
+ )
124
+ })
125
+
126
+ timeouts.push(
127
+ setTimeout(() => {
128
+ setCurrentCommand((prev) => (prev + 1) % terminalSequences.length)
129
+ }, command.length * 50 + 1000 + sequence.outputs.length * 800 + 2000),
130
+ )
131
+ }
132
+
133
+ runSequence()
134
+ return () => { timeouts.forEach(clearTimeout) }
135
+ }, [currentCommand])
139
136
 
140
137
  return (
141
- <section id="features" className="py-32 px-6">
142
- <div className="max-w-6xl mx-auto">
143
- <div className="text-center mb-20">
144
- <p className="text-xs font-mono text-muted mb-4 tracking-widest uppercase">Security Primitives</p>
145
- <h2 className="text-4xl md:text-5xl font-bold tracking-tight">
146
- Defense in depth,<br />by default.
147
- </h2>
138
+ <div className="min-h-screen bg-black text-white font-mono overflow-hidden relative">
139
+ {/* Nav */}
140
+ <nav className="border-b border-gray-800 bg-gray-950/95 backdrop-blur-sm p-4 relative z-10 sticky top-0">
141
+ <div className="flex items-center justify-between max-w-7xl mx-auto">
142
+ <div className="flex items-center gap-6">
143
+ <div className="flex items-center gap-3">
144
+ <div className="flex gap-2">
145
+ <div className="w-3 h-3 bg-red-500 hover:bg-red-400 transition-colors cursor-pointer"></div>
146
+ <div className="w-3 h-3 bg-yellow-500 hover:bg-yellow-400 transition-colors cursor-pointer"></div>
147
+ <div className="w-3 h-3 bg-green-500 hover:bg-green-400 transition-colors cursor-pointer"></div>
148
+ </div>
149
+ <div className="flex items-center gap-2">
150
+ <span className="text-white font-bold text-lg">OPM</span>
151
+ <span className="text-gray-400 text-sm">on-chain package manager</span>
152
+ </div>
153
+ </div>
154
+
155
+ <div className="hidden md:flex items-center gap-8 ml-8">
156
+ <a href="#why" className="text-gray-400 hover:text-white transition-colors cursor-pointer relative group">
157
+ <span>Why OPM?</span>
158
+ <div className="absolute bottom-0 left-0 w-0 h-0.5 bg-white transition-all duration-300 group-hover:w-full"></div>
159
+ </a>
160
+ <a href="#features" className="text-gray-400 hover:text-white transition-colors cursor-pointer relative group">
161
+ <span>Features</span>
162
+ <div className="absolute bottom-0 left-0 w-0 h-0.5 bg-white transition-all duration-300 group-hover:w-full"></div>
163
+ </a>
164
+ <a href="#agents" className="text-gray-400 hover:text-white transition-colors cursor-pointer relative group">
165
+ <span>AI Agents</span>
166
+ <div className="absolute bottom-0 left-0 w-0 h-0.5 bg-white transition-all duration-300 group-hover:w-full"></div>
167
+ </a>
168
+ <a href="#cli" className="text-gray-400 hover:text-white transition-colors cursor-pointer relative group">
169
+ <span>CLI</span>
170
+ <div className="absolute bottom-0 left-0 w-0 h-0.5 bg-white transition-all duration-300 group-hover:w-full"></div>
171
+ </a>
172
+ <a href={DOCS_URL} target="_blank" rel="noopener" className="text-gray-400 hover:text-white transition-colors cursor-pointer relative group">
173
+ <span>Docs</span>
174
+ <div className="absolute bottom-0 left-0 w-0 h-0.5 bg-white transition-all duration-300 group-hover:w-full"></div>
175
+ </a>
176
+ <a href={BASESCAN} target="_blank" rel="noopener" className="text-gray-400 hover:text-white transition-colors cursor-pointer relative group flex items-center gap-1.5">
177
+ <span className="w-1.5 h-1.5 rounded-full bg-green-500 animate-pulse" />
178
+ <span>Base Sepolia</span>
179
+ <div className="absolute bottom-0 left-0 w-0 h-0.5 bg-white transition-all duration-300 group-hover:w-full"></div>
180
+ </a>
181
+ </div>
182
+ </div>
183
+
184
+ <div className="flex items-center gap-4">
185
+ <div className="hidden sm:flex items-center gap-2 text-gray-500 text-xs">
186
+ <div className="w-2 h-2 bg-green-500 rounded-full animate-pulse"></div>
187
+ <span>v0.1.3</span>
188
+ </div>
189
+
190
+ <div
191
+ className="group relative cursor-pointer"
192
+ onClick={() => copyToClipboard("npm install -g opmsec", "nav-install")}
193
+ >
194
+ <div className="absolute inset-0 border border-gray-600 bg-gray-900/20 transition-all duration-300 group-hover:border-white group-hover:shadow-lg group-hover:shadow-white/20"></div>
195
+ <div className="relative border border-gray-400 bg-transparent text-white font-medium px-6 py-2 text-sm transition-all duration-300 group-hover:border-white group-hover:bg-gray-900/30 transform translate-x-0.5 translate-y-0.5 group-hover:translate-x-0 group-hover:translate-y-0">
196
+ <div className="flex items-center gap-2">
197
+ {copiedStates["nav-install"] ? (
198
+ <Check className="w-4 h-4 text-green-400" />
199
+ ) : (
200
+ <Copy className="w-4 h-4 text-gray-400" />
201
+ )}
202
+ <span className="text-gray-400">$</span>
203
+ <span>Install</span>
204
+ </div>
205
+ </div>
206
+ </div>
207
+ </div>
148
208
  </div>
209
+ </nav>
149
210
 
150
- <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-px bg-border rounded-2xl overflow-hidden">
151
- {features.map((f, i) => (
152
- <div key={i} className="bg-surface p-8 hover:bg-surface-hover transition-colors group">
153
- <span className="text-2xl mb-4 block opacity-40 group-hover:opacity-100 transition-opacity">{f.icon}</span>
154
- <h3 className="text-lg font-semibold mb-3">{f.title}</h3>
155
- <p className="text-sm text-muted leading-relaxed mb-4">{f.description}</p>
156
- <p className="text-xs font-mono text-muted/60 leading-relaxed">{f.detail}</p>
211
+ {/* Matrix background */}
212
+ <div className="fixed inset-0 opacity-10 pointer-events-none">
213
+ <div className="grid grid-cols-25 gap-1 h-full">
214
+ {matrixChars.map((char, i) => (
215
+ <div key={i} className="text-gray-500 text-xs animate-pulse">
216
+ {char}
157
217
  </div>
158
218
  ))}
159
219
  </div>
160
220
  </div>
161
- </section>
162
- );
163
- }
164
221
 
165
- function Architecture() {
166
- return (
167
- <section id="architecture" className="py-32 px-6 border-t border-border">
168
- <div className="max-w-6xl mx-auto">
169
- <div className="text-center mb-20">
170
- <p className="text-xs font-mono text-muted mb-4 tracking-widest uppercase">System Design</p>
171
- <h2 className="text-4xl md:text-5xl font-bold tracking-tight">
172
- Verification pipeline
173
- </h2>
174
- </div>
222
+ {/* Hero */}
223
+ <section className="relative px-6 py-20 lg:px-12">
224
+ <div className="max-w-7xl mx-auto">
225
+ <div className="text-center mb-16">
226
+ <div className="mb-8">
227
+ <pre className="text-white text-[10px] sm:text-sm md:text-xl lg:text-2xl font-bold leading-tight inline-block tracking-wide drop-shadow-[0_0_12px_rgba(255,255,255,0.3)]">{heroAsciiText}</pre>
228
+ </div>
175
229
 
176
- <div className="relative">
177
- <div className="grid grid-cols-1 md:grid-cols-5 gap-4">
178
- {[
179
- { step: '01', title: 'Pack & Sign', desc: 'SHA-256 checksum, ECDSA signature via author wallet' },
180
- { step: '02', title: 'Multi-Agent Scan', desc: '3 LLMs analyze source in parallel, each submits risk score' },
181
- { step: '03', title: 'Weighted Consensus', desc: 'Intelligence-weighted aggregate via Artificial Analysis indices' },
182
- { step: '04', title: 'On-chain Registry', desc: 'Package, scores, report URI registered on Base Sepolia' },
183
- { step: '05', title: 'Install Verify', desc: 'Signature + on-chain score + CVE check at install time' },
184
- ].map((s, i) => (
185
- <div key={i} className="relative">
186
- <div className="bg-gradient-to-b from-white/5 to-transparent border border-border rounded-xl p-6 h-full">
187
- <span className="text-xs font-mono text-muted block mb-3">{s.step}</span>
188
- <h3 className="text-sm font-semibold mb-2">{s.title}</h3>
189
- <p className="text-xs text-muted leading-relaxed">{s.desc}</p>
230
+ <h1 className="text-4xl lg:text-6xl font-bold mb-6 leading-tight">
231
+ On-chain<br />
232
+ <span className="bg-gradient-to-r from-white to-gray-400 bg-clip-text text-transparent">Package Security</span>
233
+ </h1>
234
+
235
+ <p className="text-lg text-gray-300 leading-relaxed max-w-3xl mx-auto mb-8">
236
+ Cryptographic attestation via ECDSA-signed manifests, multi-model AI auditing through
237
+ intelligence-weighted LLM consensus, and immutable risk scoring anchored to Base L2.
238
+ Zero-knowledge agent verification. Tamper-evident by design.
239
+ </p>
240
+
241
+ <div className="flex flex-col sm:flex-row gap-6 justify-center items-center">
242
+ <div
243
+ className="group relative cursor-pointer w-full sm:w-auto"
244
+ onClick={() => copyToClipboard("npm install -g opmsec", "hero-install")}
245
+ >
246
+ <div className="absolute inset-0 border border-gray-600 bg-gray-900/20 transition-all duration-300 group-hover:border-white group-hover:shadow-lg group-hover:shadow-white/20"></div>
247
+ <div className="relative border border-white bg-white text-black font-bold px-6 sm:px-10 py-4 text-base sm:text-lg transition-all duration-300 group-hover:bg-gray-100 group-hover:text-black transform translate-x-1 translate-y-1 group-hover:translate-x-0 group-hover:translate-y-0 text-center">
248
+ <div className="flex items-center justify-center gap-2 sm:gap-3">
249
+ {copiedStates["hero-install"] ? (
250
+ <Check className="w-4 h-4 sm:w-5 sm:h-5 text-green-600" />
251
+ ) : (
252
+ <Copy className="w-4 h-4 sm:w-5 sm:h-5 text-gray-600" />
253
+ )}
254
+ <span className="text-gray-600 text-sm sm:text-base">$</span>
255
+ <span className="text-sm sm:text-base">npm install -g opmsec</span>
256
+ </div>
190
257
  </div>
191
- {i < 4 && (
192
- <div className="hidden md:block absolute top-1/2 -right-2.5 w-5 h-px bg-border" />
193
- )}
194
258
  </div>
195
- ))}
259
+
260
+ <a href={DOCS_URL} target="_blank" rel="noopener" className="group relative cursor-pointer w-full sm:w-auto">
261
+ <div className="absolute inset-0 border-2 border-dashed border-gray-600 bg-gray-900/20 transition-all duration-300 group-hover:border-white group-hover:shadow-lg group-hover:shadow-white/20"></div>
262
+ <div className="relative border-2 border-dashed border-gray-400 bg-transparent text-white font-bold px-10 py-4 text-lg transition-all duration-300 group-hover:border-white group-hover:bg-gray-900/30 transform translate-x-1 translate-y-1 group-hover:translate-x-0 group-hover:translate-y-0">
263
+ <div className="flex items-center gap-3">
264
+ <span className="text-gray-400">→</span>
265
+ <span>Read the Docs</span>
266
+ </div>
267
+ </div>
268
+ </a>
269
+ </div>
196
270
  </div>
197
- </div>
198
271
 
199
- <div className="mt-20 grid grid-cols-1 md:grid-cols-3 gap-8">
200
- <div className="border border-border rounded-xl p-6 bg-surface/50">
201
- <p className="text-xs font-mono text-green-500/80 mb-3">CHAIN</p>
202
- <p className="text-sm font-semibold mb-1">Base Sepolia (L2)</p>
203
- <p className="text-xs text-muted">Low-cost, high-throughput settlement for agent score submissions and package registrations.</p>
272
+ {/* Live terminal */}
273
+ <div className="max-w-4xl mx-auto">
274
+ <div className="bg-gray-950 border border-gray-700 shadow-2xl backdrop-blur-sm">
275
+ <div className="flex items-center justify-between px-6 py-4 bg-gray-900 border-b border-gray-700">
276
+ <div className="flex items-center gap-3">
277
+ <div className="flex gap-2">
278
+ <div className="w-3 h-3 bg-red-500 hover:bg-red-400 transition-colors cursor-pointer"></div>
279
+ <div className="w-3 h-3 bg-yellow-500 hover:bg-yellow-400 transition-colors cursor-pointer"></div>
280
+ <div className="w-3 h-3 bg-green-500 hover:bg-green-400 transition-colors cursor-pointer"></div>
281
+ </div>
282
+ <span className="text-gray-400 text-sm">opm-terminal</span>
283
+ </div>
284
+ <div className="flex items-center gap-2">
285
+ <div className="w-2 h-2 bg-green-500 rounded-full animate-pulse"></div>
286
+ <span className="text-gray-500 text-xs">LIVE</span>
287
+ </div>
288
+ </div>
289
+
290
+ <div className="p-6 min-h-[300px] bg-black">
291
+ <div className="space-y-2 text-sm">
292
+ {terminalLines.map((line, index) => (
293
+ <div
294
+ key={index}
295
+ className={`${line.startsWith("user@dev") ? "text-white" : "text-gray-300"} ${line.includes("✅") || line.includes("✓") ? "text-green-400" : ""}`}
296
+ >
297
+ {line}
298
+ </div>
299
+ ))}
300
+
301
+ {!isExecuting && (
302
+ <div className="text-white">
303
+ <span className="text-green-400">user@dev</span>
304
+ <span className="text-gray-500">:</span>
305
+ <span className="text-blue-400">~/project</span>
306
+ <span className="text-white">$ </span>
307
+ <span className="text-white">{currentTyping}</span>
308
+ <span className={`text-white ${showCursor ? "opacity-100" : "opacity-0"} transition-opacity`}>█</span>
309
+ </div>
310
+ )}
311
+
312
+ {isExecuting && (
313
+ <div className="flex items-center gap-2 text-gray-400">
314
+ <div className="flex gap-1">
315
+ <div className="w-1 h-1 bg-gray-400 rounded-full animate-bounce"></div>
316
+ <div className="w-1 h-1 bg-gray-400 rounded-full animate-bounce" style={{ animationDelay: "0.1s" }}></div>
317
+ <div className="w-1 h-1 bg-gray-400 rounded-full animate-bounce" style={{ animationDelay: "0.2s" }}></div>
318
+ </div>
319
+ <span className="text-xs">Processing...</span>
320
+ </div>
321
+ )}
322
+ </div>
323
+
324
+ <div className="mt-6 pt-4 border-t border-gray-800 flex justify-between text-xs text-gray-500">
325
+ <div className="flex items-center gap-4">
326
+ <span className="text-gray-500">Commands:</span>
327
+ <span className="text-white">{currentCommand + 1}/{terminalSequences.length}</span>
328
+ </div>
329
+ <div className="flex items-center gap-4">
330
+ <span className="text-gray-500">Agents:</span>
331
+ <span className="text-gray-500">3 Active</span>
332
+ </div>
333
+ <div className="flex items-center gap-4">
334
+ <span className="text-gray-500">Chain:</span>
335
+ <span className="text-gray-500">Base Sepolia</span>
336
+ </div>
337
+ </div>
338
+ </div>
339
+ </div>
204
340
  </div>
205
- <div className="border border-border rounded-xl p-6 bg-surface/50">
206
- <p className="text-xs font-mono text-blue-400/80 mb-3">STORAGE</p>
207
- <p className="text-sm font-semibold mb-1">Fileverse (IPFS)</p>
208
- <p className="text-xs text-muted">Full audit reports uploaded to decentralized storage. URI stored on-chain for permanent reference.</p>
341
+
342
+ {/* CLI heading below terminal */}
343
+ <div className="text-center mt-12 mb-10 max-w-4xl mx-auto">
344
+ <h2 className="text-3xl lg:text-4xl font-bold mb-4">Every command, security-first.</h2>
345
+ <p className="text-lg text-gray-400 max-w-3xl mx-auto">
346
+ Drop-in replacement for npm. Every operation gains cryptographic verification, AI-powered auditing, and on-chain attestation transparently.
347
+ </p>
209
348
  </div>
210
- <div className="border border-border rounded-xl p-6 bg-surface/50">
211
- <p className="text-xs font-mono text-purple-400/80 mb-3">IDENTITY</p>
212
- <p className="text-sm font-semibold mb-1">ENS Resolution</p>
213
- <p className="text-xs text-muted">Author addresses resolved to ENS names. On-chain author profiles with reputation scoring.</p>
349
+
350
+ {/* Command cards below terminal */}
351
+ <div className="grid grid-cols-1 md:grid-cols-3 gap-6 max-w-4xl mx-auto mt-10">
352
+ {[
353
+ { num: "01", title: "Push", desc: "ECDSA-sign package manifest, dispatch to 3 independent LLM agents for parallel static analysis, aggregate weighted risk scores, register immutable attestation on Base L2", cmd: "opm push" },
354
+ { num: "02", title: "Install", desc: "Resolve ENS identity, verify ECDSA signature against on-chain registry, validate SHA-256 checksum, cross-reference OSV CVE database before extraction", cmd: "opm install <pkg>" },
355
+ { num: "03", title: "Check", desc: "Traverse full dependency DAG, run Levenshtein-distance typosquat detection against top 10k packages, OSV CVE lookup, upload report to Fileverse (IPFS)", cmd: "opm check" },
356
+ ].map((card) => (
357
+ <div key={card.num} className="group relative h-full">
358
+ <div className="absolute inset-0 bg-gradient-to-br from-gray-800 to-gray-900 transform rotate-1 group-hover:rotate-2 transition-transform duration-300"></div>
359
+ <div className="relative bg-black border border-gray-700 p-6 h-full flex flex-col justify-between hover:border-white transition-all duration-300 group-hover:shadow-xl group-hover:shadow-white/10">
360
+ <div className="text-center flex-1 flex flex-col justify-between">
361
+ <div>
362
+ <div className="w-12 h-12 mx-auto mb-4 bg-gray-900 border border-gray-600 flex items-center justify-center group-hover:border-white transition-colors group-hover:bg-gray-800">
363
+ <span className="text-lg font-mono text-white group-hover:text-gray-100">{card.num}</span>
364
+ </div>
365
+ <h3 className="text-lg font-bold mb-3 text-white group-hover:text-gray-100">{card.title}</h3>
366
+ <p className="text-gray-400 mb-4 group-hover:text-gray-300 text-sm leading-relaxed">{card.desc}</p>
367
+ </div>
368
+ <div
369
+ className="bg-gray-900 border border-gray-700 p-2.5 font-mono text-xs text-left group-hover:border-gray-500 transition-colors group-hover:bg-gray-800 cursor-pointer flex items-center justify-between"
370
+ onClick={() => copyToClipboard(card.cmd, `${card.num}-cmd`)}
371
+ >
372
+ <div className="flex items-center gap-2">
373
+ <span className="text-gray-500">$ </span>
374
+ <span className="text-white group-hover:text-gray-100">{card.cmd}</span>
375
+ </div>
376
+ {copiedStates[`${card.num}-cmd`] ? (
377
+ <Check className="w-3 h-3 text-green-400" />
378
+ ) : (
379
+ <Copy className="w-3 h-3 text-gray-400 hover:text-white transition-colors" />
380
+ )}
381
+ </div>
382
+ </div>
383
+ </div>
384
+ </div>
385
+ ))}
214
386
  </div>
215
387
  </div>
216
- </div>
217
- </section>
218
- );
219
- }
220
-
221
- function CLISection() {
222
- const commands = [
223
- { cmd: 'opm push', desc: 'Sign, scan with 3 AI agents, publish, register on-chain' },
224
- { cmd: 'opm install <pkg>', desc: 'Install with signature + on-chain + CVE verification' },
225
- { cmd: 'opm check', desc: 'Scan all deps: typosquats, CVEs, AI analysis, Fileverse report' },
226
- { cmd: 'opm fix', desc: 'Auto-fix typosquats and vulnerable versions' },
227
- { cmd: 'opm audit', desc: 'On-chain + CVE audit for entire dependency tree' },
228
- { cmd: 'opm info <pkg>', desc: 'On-chain metadata, agent scores, safest version' },
229
- { cmd: 'opm register-agent', desc: 'Register a new security agent (ZK-verified)' },
230
- { cmd: 'opm view <name.eth>', desc: 'ENS author profile, reputation, published packages' },
231
- ];
388
+ </section>
232
389
 
233
- return (
234
- <section id="cli" className="py-32 px-6 border-t border-border">
235
- <div className="max-w-6xl mx-auto">
236
- <div className="grid grid-cols-1 lg:grid-cols-2 gap-16">
237
- <div>
238
- <p className="text-xs font-mono text-muted mb-4 tracking-widest uppercase">CLI Reference</p>
239
- <h2 className="text-4xl font-bold tracking-tight mb-6">
240
- Every command,<br />security-first.
390
+ {/* Why OPM — Real incidents */}
391
+ <section className="px-6 py-24 lg:px-12 border-t border-gray-800 relative overflow-hidden" id="why">
392
+ <div className="absolute inset-0 bg-gradient-to-b from-red-950/10 via-transparent to-transparent pointer-events-none" />
393
+
394
+ <div className="max-w-7xl mx-auto relative z-10">
395
+ <div className="text-center mb-8">
396
+ <div className="inline-flex items-center gap-2 px-4 py-1.5 border border-red-900/60 bg-red-950/30 text-red-400 text-xs font-mono tracking-widest uppercase mb-6">
397
+ <span className="w-1.5 h-1.5 rounded-full bg-red-500 animate-pulse" />
398
+ Active Threat Landscape
399
+ </div>
400
+ <h2 className="text-4xl lg:text-6xl font-bold mb-6 leading-tight">
401
+ This is happening<br />
402
+ <span className="text-red-400">right now.</span>
241
403
  </h2>
242
- <p className="text-muted leading-relaxed mb-8">
243
- Drop-in replacement for npm. Every operation gains cryptographic verification, AI-powered auditing, and on-chain attestation transparently.
404
+ <p className="text-lg text-gray-400 max-w-2xl mx-auto">
405
+ Supply chain attacks on npm aren&apos;t theoretical. Developers are losing money, shipping CVEs, and installing malware — every single week.
244
406
  </p>
245
- <a href={DOCS_URL} target="_blank" rel="noopener" className="inline-flex items-center gap-2 text-sm font-medium px-4 py-2 border border-border rounded-lg hover:bg-surface transition-colors">
246
- Full CLI documentation
247
- </a>
248
407
  </div>
249
408
 
250
- <div className="terminal-glow rounded-xl border border-border bg-surface overflow-hidden">
251
- <div className="flex items-center gap-2 px-4 py-3 border-b border-border">
252
- <div className="w-3 h-3 rounded-full bg-[#ff5f57]" />
253
- <div className="w-3 h-3 rounded-full bg-[#febc2e]" />
254
- <div className="w-3 h-3 rounded-full bg-[#28c840]" />
255
- <span className="ml-2 text-xs text-muted font-mono">terminal</span>
409
+ {/* Stats bar */}
410
+ <div className="grid grid-cols-2 md:grid-cols-4 gap-px bg-gray-800 max-w-4xl mx-auto mb-16">
411
+ {[
412
+ { num: "6,847", label: "Malicious packages", sub: "removed from npm in 2025" },
413
+ { num: "$15M+", label: "Developer losses", sub: "from wallet drainer packages" },
414
+ { num: "23%", label: "Projects affected", sub: "by known CVEs in deps" },
415
+ { num: "4 hrs", label: "Avg time to detect", sub: "a supply chain attack" },
416
+ ].map((stat, i) => (
417
+ <div key={i} className="bg-black p-6 text-center group hover:bg-gray-950 transition-colors">
418
+ <p className="text-2xl lg:text-3xl font-bold text-white mb-1 group-hover:text-red-400 transition-colors">{stat.num}</p>
419
+ <p className="text-sm text-gray-300 font-medium">{stat.label}</p>
420
+ <p className="text-xs text-gray-600 mt-1">{stat.sub}</p>
421
+ </div>
422
+ ))}
423
+ </div>
424
+
425
+ {/* Incident cards */}
426
+ <div className="grid grid-cols-1 md:grid-cols-12 gap-4 max-w-6xl mx-auto">
427
+ {/* Large card — PhantomRaven attack */}
428
+ <div className="md:col-span-7 group relative">
429
+ <div className="absolute inset-0 bg-red-950/20 transform rotate-[0.5deg] group-hover:rotate-0 transition-transform duration-500" />
430
+ <div className="relative bg-gray-950 border border-gray-800 group-hover:border-red-900/50 transition-all duration-500 overflow-hidden">
431
+ <div className="px-4 py-2.5 bg-gray-900 border-b border-gray-800 flex items-center justify-between">
432
+ <div className="flex items-center gap-2">
433
+ <span className="w-2 h-2 rounded-full bg-red-500" />
434
+ <span className="text-xs text-gray-400 font-mono">cyberpress.org — March 2026</span>
435
+ </div>
436
+ <span className="text-[10px] text-red-400 font-mono tracking-wider uppercase">Supply Chain Attack</span>
437
+ </div>
438
+ <div className="relative aspect-[16/9] overflow-hidden">
439
+ <Image
440
+ src="/phantomraven-npm-attack.png"
441
+ alt="PhantomRaven malware targeting npm supply chain"
442
+ fill
443
+ className="object-cover object-top opacity-90 group-hover:opacity-100 group-hover:scale-[1.02] transition-all duration-700"
444
+ />
445
+ <div className="absolute inset-0 bg-gradient-to-t from-gray-950 via-transparent to-transparent" />
446
+ </div>
447
+ <div className="p-5">
448
+ <h3 className="text-lg font-bold text-white mb-1">PhantomRaven Targets npm Supply Chain</h3>
449
+ <p className="text-sm text-gray-400">Malware campaign targeting developer secrets through typosquatted packages. Thousands of downloads before detection.</p>
450
+ </div>
451
+ </div>
452
+ </div>
453
+
454
+ {/* Right column — stacked */}
455
+ <div className="md:col-span-5 flex flex-col gap-4">
456
+ {/* Wallet drain */}
457
+ <div className="group relative flex-1">
458
+ <div className="relative bg-gray-950 border border-gray-800 group-hover:border-red-900/50 transition-all duration-500 overflow-hidden h-full">
459
+ <div className="px-4 py-2.5 bg-gray-900 border-b border-gray-800 flex items-center justify-between">
460
+ <div className="flex items-center gap-2">
461
+ <span className="w-2 h-2 rounded-full bg-red-500" />
462
+ <span className="text-xs text-gray-400 font-mono">@imanishbarnwal</span>
463
+ </div>
464
+ <span className="text-[10px] text-red-400 font-mono tracking-wider uppercase">Funds Lost</span>
465
+ </div>
466
+ <div className="relative aspect-[16/10] overflow-hidden">
467
+ <Image
468
+ src="/wallet-drain-exploit.png"
469
+ alt="Developer lost money from silent dev environment exploit"
470
+ fill
471
+ className="object-cover object-top opacity-90 group-hover:opacity-100 group-hover:scale-[1.02] transition-all duration-700"
472
+ />
473
+ <div className="absolute inset-0 bg-gradient-to-t from-gray-950 via-transparent to-transparent" />
474
+ </div>
475
+ <div className="p-4">
476
+ <p className="text-sm text-gray-300 font-medium">&ldquo;I lost a significant amount of money due to a silent, zero-interaction dev environment exploit.&rdquo;</p>
477
+ </div>
478
+ </div>
479
+ </div>
480
+ </div>
481
+
482
+ {/* Bottom row — 3 cards */}
483
+ <div className="md:col-span-4 group relative">
484
+ <div className="relative bg-gray-950 border border-gray-800 group-hover:border-orange-900/50 transition-all duration-500 overflow-hidden">
485
+ <div className="px-4 py-2.5 bg-gray-900 border-b border-gray-800 flex items-center justify-between">
486
+ <div className="flex items-center gap-2">
487
+ <span className="w-2 h-2 rounded-full bg-orange-500" />
488
+ <span className="text-xs text-gray-400 font-mono">@nextjs — 213K views</span>
489
+ </div>
490
+ <span className="text-[10px] text-orange-400 font-mono tracking-wider uppercase">CVE</span>
491
+ </div>
492
+ <div className="relative aspect-[4/3] overflow-hidden">
493
+ <Image
494
+ src="/nextjs-cve-announcement.png"
495
+ alt="Next.js critical CVE-2025-66478 announcement"
496
+ fill
497
+ className="object-cover object-top opacity-90 group-hover:opacity-100 group-hover:scale-[1.02] transition-all duration-700"
498
+ />
499
+ <div className="absolute inset-0 bg-gradient-to-t from-gray-950 via-transparent to-transparent" />
500
+ </div>
501
+ <div className="p-4">
502
+ <p className="text-xs text-gray-400">Critical vulnerability in React Server Components affecting Next.js. 213K+ views.</p>
503
+ </div>
504
+ </div>
505
+ </div>
506
+
507
+ <div className="md:col-span-4 group relative">
508
+ <div className="relative bg-gray-950 border border-gray-800 group-hover:border-yellow-900/50 transition-all duration-500 overflow-hidden">
509
+ <div className="px-4 py-2.5 bg-gray-900 border-b border-gray-800 flex items-center justify-between">
510
+ <div className="flex items-center gap-2">
511
+ <span className="w-2 h-2 rounded-full bg-yellow-500" />
512
+ <span className="text-xs text-gray-400 font-mono">@trashh_dev</span>
513
+ </div>
514
+ <span className="text-[10px] text-yellow-400 font-mono tracking-wider uppercase">React CVE</span>
515
+ </div>
516
+ <div className="relative aspect-[4/3] overflow-hidden">
517
+ <Image
518
+ src="/react-cve-meme.png"
519
+ alt="Developer reaction to React CVE announcement"
520
+ fill
521
+ className="object-cover object-top opacity-90 group-hover:opacity-100 group-hover:scale-[1.02] transition-all duration-700"
522
+ />
523
+ <div className="absolute inset-0 bg-gradient-to-t from-gray-950 via-transparent to-transparent" />
524
+ </div>
525
+ <div className="p-4">
526
+ <p className="text-xs text-gray-400">How developers react to yet another critical CVE in their dependency tree.</p>
527
+ </div>
528
+ </div>
256
529
  </div>
257
- <div className="p-5 font-mono text-sm space-y-3">
258
- {commands.map((c, i) => (
259
- <div key={i} className="flex gap-3">
260
- <span className="text-muted shrink-0">$</span>
261
- <div>
262
- <span className="text-green-400">{c.cmd}</span>
263
- <span className="text-muted/50 text-xs block mt-0.5">{c.desc}</span>
530
+
531
+ <div className="md:col-span-4 group relative">
532
+ <div className="relative bg-gray-950 border border-gray-800 group-hover:border-gray-600 transition-all duration-500 overflow-hidden">
533
+ <div className="px-4 py-2.5 bg-gray-900 border-b border-gray-800 flex items-center justify-between">
534
+ <div className="flex items-center gap-2">
535
+ <span className="w-2 h-2 rounded-full bg-blue-500" />
536
+ <span className="text-xs text-gray-400 font-mono">@arsh_goyal</span>
264
537
  </div>
538
+ <span className="text-[10px] text-gray-400 font-mono tracking-wider uppercase">Reality Check</span>
539
+ </div>
540
+ <div className="relative aspect-[4/3] overflow-hidden">
541
+ <Image
542
+ src="/dependency-bottleneck.png"
543
+ alt="Dependency management is the bottleneck"
544
+ fill
545
+ className="object-cover object-top opacity-90 group-hover:opacity-100 group-hover:scale-[1.02] transition-all duration-700"
546
+ />
547
+ <div className="absolute inset-0 bg-gradient-to-t from-gray-950 via-transparent to-transparent" />
265
548
  </div>
266
- ))}
549
+ <div className="p-4">
550
+ <p className="text-xs text-gray-400">&ldquo;Code generation isn&apos;t the bottleneck anymore. Dependency management is.&rdquo;</p>
551
+ </div>
552
+ </div>
553
+ </div>
554
+ </div>
555
+
556
+ {/* CTA after incidents */}
557
+ <div className="text-center mt-16">
558
+ <div className="inline-flex flex-col items-center gap-4">
559
+ <p className="text-lg text-gray-400">
560
+ OPM catches these before they reach your <span className="text-white font-mono">node_modules</span>.
561
+ </p>
562
+ <div className="flex items-center gap-3 text-sm font-mono text-gray-500">
563
+ <span className="text-green-400">$</span>
564
+ <span className="text-white">npm install -g opmsec</span>
565
+ <span className="text-gray-600">&&</span>
566
+ <span className="text-white">opm install</span>
567
+ </div>
267
568
  </div>
268
569
  </div>
269
570
  </div>
270
- </div>
271
- </section>
272
- );
273
- }
571
+ </section>
274
572
 
275
- function ContractSection() {
276
- return (
277
- <section className="py-32 px-6 border-t border-border">
278
- <div className="max-w-4xl mx-auto text-center">
279
- <p className="text-xs font-mono text-muted mb-4 tracking-widest uppercase">Smart Contract</p>
280
- <h2 className="text-4xl font-bold tracking-tight mb-6">
281
- Fully on-chain. Fully verifiable.
282
- </h2>
283
- <p className="text-muted max-w-2xl mx-auto mb-12">
284
- OPMRegistry.sol deployed on Base Sepolia. Every package registration, agent score submission, and author profile is an immutable on-chain record.
285
- </p>
286
-
287
- <div className="grid grid-cols-2 md:grid-cols-4 gap-px bg-border rounded-xl overflow-hidden mb-12">
288
- {[
289
- { label: 'Packages', desc: 'Registered' },
290
- { label: 'Agent Scores', desc: 'Submitted' },
291
- { label: 'Authors', desc: 'Verified' },
292
- { label: 'Reports', desc: 'On IPFS' },
293
- ].map((s, i) => (
294
- <div key={i} className="bg-surface p-6">
295
- <p className="text-xs text-muted mb-1">{s.desc}</p>
296
- <p className="text-sm font-semibold">{s.label}</p>
573
+ {/* Features */}
574
+ <section className="px-6 py-20 lg:px-12 border-t border-gray-800" id="features">
575
+ <div className="max-w-7xl mx-auto">
576
+ <div className="text-center mb-16">
577
+ <h2 className="text-4xl lg:text-5xl font-bold mb-6">Security Primitives</h2>
578
+ <p className="text-xl text-gray-400">Defense in depth, by default.</p>
579
+ </div>
580
+
581
+ <div className="max-w-4xl mx-auto">
582
+ <div className="bg-gray-950 border border-gray-800 shadow-2xl">
583
+ <div className="flex items-center justify-between px-6 py-4 bg-gray-900 border-b border-gray-700">
584
+ <div className="flex items-center gap-3">
585
+ <div className="flex gap-2">
586
+ <div className="w-3 h-3 bg-red-500"></div>
587
+ <div className="w-3 h-3 bg-yellow-500"></div>
588
+ <div className="w-3 h-3 bg-green-500"></div>
589
+ </div>
590
+ <span className="text-gray-400 text-sm">opm features --list</span>
591
+ </div>
592
+ <div className="flex items-center gap-2">
593
+ <div className="w-2 h-2 bg-green-500 rounded-full animate-pulse"></div>
594
+ <span className="text-gray-500 text-xs">6 ACTIVE</span>
595
+ </div>
596
+ </div>
597
+
598
+ <div className="p-6 bg-black">
599
+ <div className="text-sm text-gray-400 mb-4">$ opm features --scan</div>
600
+
601
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-4 font-mono text-sm mb-6">
602
+ {[
603
+ { name: "multi-agent-consensus", status: "✓", desc: "N-of-M parallel LLM dispatch with intelligence-weighted aggregation via Artificial Analysis benchmarks. No single-model failure point." },
604
+ { name: "cryptographic-attestation", status: "✓", desc: "SHA-256 content-addressable checksums + secp256k1 ECDSA signatures. Tamper-evident supply chain attestation." },
605
+ { name: "zk-agent-verification", status: "✓", desc: "Hash-commitment ZK scheme with circom circuit reference. Accuracy proven without revealing labeled test data." },
606
+ { name: "on-chain-registry", status: "✓", desc: "OPMRegistry.sol: authorizedAgents, packages, versionData, AgentScores mappings. Fully queryable immutable state." },
607
+ { name: "cve-typosquat-detection", status: "✓", desc: "OSV advisory database integration + Levenshtein-distance analysis against top 10k npm packages. Dependency confusion detection." },
608
+ { name: "drop-in-npm-replacement", status: "✓", desc: "Transparent npm CLI interop: install, audit, check, push, fix — each operation layered with cryptographic verification." },
609
+ ].map((f) => (
610
+ <div
611
+ key={f.name}
612
+ className="flex items-center justify-between py-2 px-3 hover:bg-gray-900 cursor-pointer group transition-all duration-200 border border-transparent hover:border-gray-700"
613
+ >
614
+ <div className="flex items-center gap-3">
615
+ <span className="text-green-400 group-hover:text-white transition-colors w-4">{f.status}</span>
616
+ <span className="text-white group-hover:text-gray-200 transition-colors">{f.name}</span>
617
+ </div>
618
+ <div className="opacity-0 group-hover:opacity-100 transition-opacity text-gray-500 text-xs max-w-[250px] text-right">
619
+ {f.desc}
620
+ </div>
621
+ </div>
622
+ ))}
623
+ </div>
624
+
625
+ <div className="pt-4 border-t border-gray-800">
626
+ <div className="flex items-center gap-4 text-xs text-gray-500 justify-center">
627
+ <div className="flex items-center gap-2">
628
+ <div className="w-2 h-2 bg-green-500 rounded-full"></div>
629
+ <span>6 Active</span>
630
+ </div>
631
+ <div className="flex items-center gap-2">
632
+ <div className="w-2 h-2 bg-green-500 rounded-full animate-pulse"></div>
633
+ <span>Zero config</span>
634
+ </div>
635
+ </div>
636
+ </div>
637
+ </div>
297
638
  </div>
298
- ))}
639
+ </div>
299
640
  </div>
641
+ </section>
300
642
 
301
- <div className="inline-flex items-center gap-3">
302
- <a
303
- href={BASESCAN}
304
- target="_blank"
305
- rel="noopener"
306
- className="flex items-center gap-2 text-sm font-mono text-muted hover:text-accent transition-colors px-4 py-2 border border-border rounded-lg"
307
- >
308
- <span className="w-2 h-2 rounded-full bg-green-500" />
309
- View on BaseScan
310
- </a>
311
- <a
312
- href={`${GITHUB_URL}/blob/main/packages/contracts/contracts/OPMRegistry.sol`}
313
- target="_blank"
314
- rel="noopener"
315
- className="flex items-center gap-2 text-sm text-muted hover:text-accent transition-colors px-4 py-2 border border-border rounded-lg"
316
- >
317
- Source Code
318
- </a>
643
+ {/* AI Agents */}
644
+ <section className="px-6 py-20 lg:px-12 border-t border-gray-800" id="agents">
645
+ <div className="max-w-7xl mx-auto">
646
+ <div className="text-center mb-16">
647
+ <h2 className="text-4xl lg:text-5xl font-bold mb-6">Multi-Agent Consensus</h2>
648
+ <p className="text-xl text-gray-400">N-of-M heterogeneous LLM ensemble with intelligence-weighted scoring derived from live Artificial Analysis quality and coding indices. Byzantine fault-tolerant by design.</p>
649
+ </div>
650
+
651
+ <div className="max-w-4xl mx-auto">
652
+ <div className="bg-gray-950 border border-gray-800 shadow-2xl">
653
+ <div className="flex items-center justify-between px-6 py-4 bg-gray-900 border-b border-gray-700">
654
+ <div className="flex items-center gap-3">
655
+ <div className="flex gap-2">
656
+ <div className="w-3 h-3 bg-red-500"></div>
657
+ <div className="w-3 h-3 bg-yellow-500"></div>
658
+ <div className="w-3 h-3 bg-green-500"></div>
659
+ </div>
660
+ <span className="text-gray-400 text-sm">opm agents --status</span>
661
+ </div>
662
+ <div className="flex items-center gap-2">
663
+ <div className="w-2 h-2 bg-green-500 rounded-full animate-pulse"></div>
664
+ <span className="text-gray-500 text-xs">3 AUTHORIZED</span>
665
+ </div>
666
+ </div>
667
+
668
+ <div className="p-6 bg-black">
669
+ <div className="text-sm text-gray-400 mb-4">$ opm agents --list</div>
670
+
671
+ <div className="space-y-2 font-mono text-sm">
672
+ {[
673
+ { id: "1", name: "claude-opus-4.6", provider: "anthropic", role: "Primary scanner", color: "text-green-400" },
674
+ { id: "2", name: "gemini-3.1-pro", provider: "google", role: "Secondary analysis", color: "text-green-400" },
675
+ { id: "3", name: "deepseek-v3.2", provider: "deepseek", role: "Tertiary verification", color: "text-green-400" },
676
+ ].map((agent) => (
677
+ <div
678
+ key={agent.id}
679
+ className="flex items-center justify-between py-2 px-4 hover:bg-gray-900 cursor-pointer group transition-all duration-200 border border-transparent hover:border-gray-700"
680
+ >
681
+ <div className="flex items-center gap-4">
682
+ <span className="text-gray-500 w-6">[{agent.id}]</span>
683
+ <span className={`${agent.color} group-hover:text-white transition-colors`}>●</span>
684
+ <span className="text-white group-hover:text-gray-200 transition-colors">{agent.name}</span>
685
+ <span className="text-gray-500 text-xs">({agent.provider})</span>
686
+ </div>
687
+ <div className="opacity-0 group-hover:opacity-100 transition-opacity text-gray-500 text-xs">
688
+ {agent.role}
689
+ </div>
690
+ </div>
691
+ ))}
692
+ </div>
693
+
694
+ <div className="mt-6 pt-4 border-t border-gray-800">
695
+ <div className="flex flex-col md:flex-row justify-between items-start md:items-center gap-4">
696
+ <div className="text-sm text-gray-400">
697
+ <div className="font-mono text-xs text-gray-500 space-y-1">
698
+ <div>$ opm register-agent --name my-agent --model gpt-5.4</div>
699
+ <div>$ opm info express # View agent scores</div>
700
+ </div>
701
+ </div>
702
+
703
+ <div className="flex items-center gap-6 text-xs text-gray-500">
704
+ <div className="flex items-center gap-2">
705
+ <div className="w-2 h-2 bg-green-500 rounded-full"></div>
706
+ <span>3 Active</span>
707
+ </div>
708
+ <div className="flex items-center gap-2">
709
+ <div className="w-2 h-2 bg-gray-500 rounded-full animate-pulse"></div>
710
+ <span>ZK-verified</span>
711
+ </div>
712
+ </div>
713
+ </div>
714
+ </div>
715
+ </div>
716
+ </div>
717
+
718
+ <div className="mt-6 text-center">
719
+ <div className="inline-flex items-center gap-2 text-gray-400 text-sm">
720
+ <span className="text-green-400">●</span>
721
+ <span>Permissionless registration • 100% benchmark accuracy required • Scores on-chain</span>
722
+ </div>
723
+ </div>
724
+ </div>
319
725
  </div>
320
- </div>
321
- </section>
322
- );
323
- }
726
+ </section>
324
727
 
325
- function Footer() {
326
- return (
327
- <footer className="border-t border-border py-12 px-6">
328
- <div className="max-w-6xl mx-auto flex flex-col md:flex-row items-center justify-between gap-6">
329
- <a href="/" className="flex items-center gap-2.5 hover:opacity-80 transition-opacity">
330
- <Logo size={18} />
331
- <span className="font-semibold tracking-tight">opm</span>
332
- <span className="text-xs text-muted">On-chain Package Manager</span>
333
- </a>
334
- <div className="flex items-center gap-6 text-sm text-muted">
335
- <a href={DOCS_URL} target="_blank" rel="noopener" className="hover:text-accent transition-colors">Docs</a>
336
- <a href={GITHUB_URL} target="_blank" rel="noopener" className="hover:text-accent transition-colors">GitHub</a>
337
- <a href={NPM_URL} target="_blank" rel="noopener" className="hover:text-accent transition-colors">npm</a>
338
- <a href={BASESCAN} target="_blank" rel="noopener" className="hover:text-accent transition-colors">Contract</a>
728
+ {/* Pipeline */}
729
+ <section className="px-6 py-16 lg:px-12 border-t border-gray-800" id="pipeline">
730
+ <div className="max-w-7xl mx-auto">
731
+ <div className="text-center mb-12">
732
+ <h2 className="text-3xl lg:text-4xl font-bold mb-4">Verification Pipeline</h2>
733
+ <p className="text-lg text-gray-400 max-w-2xl mx-auto">
734
+ Five-stage cryptographic attestation pipeline: from ECDSA signing through multi-agent consensus to on-chain settlement. Every package is verified before extraction to node_modules.
735
+ </p>
736
+ </div>
737
+
738
+ <div className="max-w-4xl mx-auto">
739
+ <div className="bg-gray-950 border border-gray-800 shadow-xl">
740
+ <div className="flex items-center justify-between px-6 py-3 bg-gray-900 border-b border-gray-700">
741
+ <div className="flex items-center gap-3">
742
+ <div className="flex gap-2">
743
+ <div className="w-3 h-3 bg-red-500"></div>
744
+ <div className="w-3 h-3 bg-yellow-500"></div>
745
+ <div className="w-3 h-3 bg-green-500"></div>
746
+ </div>
747
+ <span className="text-gray-400 text-sm">opm pipeline --visualize</span>
748
+ </div>
749
+ </div>
750
+
751
+ <div className="p-6 bg-black">
752
+ <div className="grid grid-cols-1 md:grid-cols-5 gap-4 font-mono text-sm">
753
+ {[
754
+ { step: "01", title: "Pack & Sign", desc: "SHA-256 content-addressable checksum + secp256k1 ECDSA signature via author wallet" },
755
+ { step: "02", title: "Multi-Agent Scan", desc: "Parallel dispatch to N heterogeneous LLMs; each submits independent risk vector" },
756
+ { step: "03", title: "Weighted Consensus", desc: "Intelligence-weighted aggregate via Artificial Analysis quality + coding indices" },
757
+ { step: "04", title: "On-chain Registry", desc: "Package metadata, agent scores, Fileverse report URI settled on Base Sepolia L2" },
758
+ { step: "05", title: "Install Verify", desc: "ECDSA signature + on-chain score lookup + OSV CVE cross-reference at extraction time" },
759
+ ].map((s, i) => (
760
+ <div key={i} className="relative group">
761
+ <div className="border border-gray-700 p-4 hover:border-white transition-all duration-300 group-hover:bg-gray-900">
762
+ <span className="text-xs text-gray-500 block mb-2">{s.step}</span>
763
+ <h3 className="text-sm font-semibold mb-1 text-white">{s.title}</h3>
764
+ <p className="text-xs text-gray-500">{s.desc}</p>
765
+ </div>
766
+ {i < 4 && (
767
+ <div className="hidden md:block absolute top-1/2 -right-2.5 w-5 h-px bg-gray-700" />
768
+ )}
769
+ </div>
770
+ ))}
771
+ </div>
772
+ </div>
773
+ </div>
774
+ </div>
339
775
  </div>
340
- <p className="text-xs text-muted/50">MIT License</p>
341
- </div>
342
- </footer>
343
- );
344
- }
776
+ </section>
345
777
 
346
- export default function Home() {
347
- return (
348
- <main>
349
- <Nav />
350
- <Hero />
351
- <Features />
352
- <Architecture />
353
- <CLISection />
354
- <ContractSection />
355
- <Footer />
356
- </main>
357
- );
358
- }
778
+ {/* Contract info */}
779
+ <section className="px-6 py-16 lg:px-12 border-t border-gray-800">
780
+ <div className="max-w-4xl mx-auto text-center">
781
+ <h2 className="text-3xl font-bold mb-4">Fully on-chain. Fully verifiable.</h2>
782
+ <p className="text-gray-400 mb-8">OPMRegistry.sol deployed on Base Sepolia L2. Every package registration, agent score submission, ZK-verified agent authorization, and ENS-resolved author profile is an immutable on-chain record. Fully queryable, fully verifiable.</p>
783
+
784
+ <div className="grid grid-cols-2 md:grid-cols-4 gap-px bg-gray-800 mb-8">
785
+ {[
786
+ { label: "Packages", desc: "Registered" },
787
+ { label: "Agent Scores", desc: "Submitted" },
788
+ { label: "Authors", desc: "Verified" },
789
+ { label: "Reports", desc: "On IPFS" },
790
+ ].map((s, i) => (
791
+ <div key={i} className="bg-black p-6">
792
+ <p className="text-xs text-gray-500 mb-1">{s.desc}</p>
793
+ <p className="text-sm font-semibold">{s.label}</p>
794
+ </div>
795
+ ))}
796
+ </div>
797
+
798
+ <div className="inline-flex items-center gap-4">
799
+ <a
800
+ href={BASESCAN}
801
+ target="_blank"
802
+ rel="noopener"
803
+ className="flex items-center gap-2 text-sm font-mono text-gray-400 hover:text-white transition-colors px-4 py-2 border border-gray-700 hover:border-white"
804
+ >
805
+ <span className="w-2 h-2 rounded-full bg-green-500"></span>
806
+ View on BaseScan
807
+ </a>
808
+ <a
809
+ href={`${GITHUB_URL}/blob/main/packages/contracts/contracts/OPMRegistry.sol`}
810
+ target="_blank"
811
+ rel="noopener"
812
+ className="flex items-center gap-2 text-sm text-gray-400 hover:text-white transition-colors px-4 py-2 border border-gray-700 hover:border-white"
813
+ >
814
+ Source Code
815
+ </a>
816
+ </div>
817
+ </div>
818
+ </section>
819
+
820
+ {/* Footer */}
821
+ <footer className="border-t border-gray-800 px-6 py-12 lg:px-12 bg-gray-950">
822
+ <div className="max-w-7xl mx-auto">
823
+ <div className="flex flex-col md:flex-row items-center justify-between gap-6">
824
+ <div className="flex items-center gap-2.5">
825
+ <span className="font-bold">OPM</span>
826
+ <span className="text-xs text-gray-500">On-chain Package Manager</span>
827
+ </div>
828
+ <div className="flex items-center gap-6 text-sm text-gray-500">
829
+ <a href={DOCS_URL} target="_blank" rel="noopener" className="hover:text-white transition-colors">Docs</a>
830
+ <a href={GITHUB_URL} target="_blank" rel="noopener" className="hover:text-white transition-colors">GitHub</a>
831
+ <a href={NPM_URL} target="_blank" rel="noopener" className="hover:text-white transition-colors">npm</a>
832
+ <a href={BASESCAN} target="_blank" rel="noopener" className="hover:text-white transition-colors">Contract</a>
833
+ </div>
834
+ <p className="text-xs text-gray-700">MIT License</p>
835
+ </div>
836
+ </div>
837
+ </footer>
838
+ </div>
839
+ )
840
+ }