opmsec 0.1.0 → 0.1.3
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/.env.example +23 -13
- package/README.md +256 -173
- package/docs/architecture/agents.mdx +77 -0
- package/docs/architecture/benchmarks.mdx +65 -0
- package/docs/architecture/overview.mdx +58 -0
- package/docs/architecture/scanner.mdx +53 -0
- package/docs/cli/audit.mdx +35 -0
- package/docs/cli/check.mdx +44 -0
- package/docs/cli/fix.mdx +49 -0
- package/docs/cli/info.mdx +44 -0
- package/docs/cli/install.mdx +71 -0
- package/docs/cli/push.mdx +99 -0
- package/docs/cli/register-agent.mdx +80 -0
- package/docs/cli/view.mdx +52 -0
- package/docs/concepts/multi-agent-consensus.mdx +58 -0
- package/docs/concepts/on-chain-registry.mdx +74 -0
- package/docs/concepts/security-model.mdx +76 -0
- package/docs/concepts/zk-agent-verification.mdx +82 -0
- package/docs/configuration.mdx +82 -0
- package/docs/contract/deployment.mdx +57 -0
- package/docs/contract/events.mdx +115 -0
- package/docs/contract/functions.mdx +220 -0
- package/docs/contract/overview.mdx +58 -0
- package/docs/favicon.svg +5 -0
- package/docs/introduction.mdx +43 -0
- package/docs/logo/dark.svg +5 -0
- package/docs/logo/light.svg +5 -0
- package/docs/mint.json +106 -0
- package/docs/quickstart.mdx +133 -0
- package/package.json +3 -3
- package/packages/cli/src/commands/author-view.tsx +9 -1
- package/packages/cli/src/commands/check.tsx +318 -0
- package/packages/cli/src/commands/fix.tsx +294 -0
- package/packages/cli/src/commands/install.tsx +229 -33
- package/packages/cli/src/commands/push.tsx +53 -22
- package/packages/cli/src/commands/register-agent.tsx +227 -0
- package/packages/cli/src/components/AgentScores.tsx +20 -6
- package/packages/cli/src/components/Hyperlink.tsx +30 -0
- package/packages/cli/src/components/ScanReport.tsx +3 -2
- package/packages/cli/src/index.tsx +41 -5
- package/packages/cli/src/services/avatar.ts +43 -6
- package/packages/cli/src/services/chainpatrol.ts +20 -17
- package/packages/cli/src/services/contract.ts +41 -8
- package/packages/cli/src/services/ens.ts +3 -5
- package/packages/cli/src/services/fileverse.ts +12 -13
- package/packages/cli/src/services/typosquat.ts +166 -0
- package/packages/contracts/circuits/accuracy_verifier.circom +101 -0
- package/packages/contracts/contracts/OPMRegistry.sol +63 -0
- package/packages/contracts/scripts/deploy.ts +22 -3
- package/packages/core/src/abi.ts +221 -0
- package/packages/core/src/benchmarks.ts +450 -0
- package/packages/core/src/constants.ts +20 -0
- package/packages/core/src/index.ts +2 -0
- package/packages/core/src/model-rankings.ts +115 -0
- package/packages/core/src/prompt.ts +58 -0
- package/packages/core/src/types.ts +41 -0
- package/packages/core/src/utils.ts +7 -3
- package/packages/scanner/src/agents/base-agent.ts +13 -3
- package/packages/scanner/src/index.ts +5 -2
- package/packages/scanner/src/queue/memory-queue.ts +8 -3
- package/packages/scanner/src/services/benchmark-runner.ts +114 -0
- package/packages/scanner/src/services/contract-writer.ts +2 -3
- package/packages/scanner/src/services/fileverse.ts +26 -7
- package/packages/scanner/src/services/openrouter.ts +46 -0
- package/packages/scanner/src/services/report-formatter.ts +122 -3
- package/packages/scanner/src/services/zk-verifier.ts +118 -0
- package/packages/web/.next/app-build-manifest.json +15 -0
- package/packages/web/.next/build-manifest.json +20 -0
- package/packages/web/.next/package.json +1 -0
- package/packages/web/.next/prerender-manifest.json +11 -0
- package/packages/web/.next/react-loadable-manifest.json +1 -0
- package/packages/web/.next/routes-manifest.json +1 -0
- package/packages/web/.next/server/app/page.js +272 -0
- package/packages/web/.next/server/app/page_client-reference-manifest.js +1 -0
- package/packages/web/.next/server/app-paths-manifest.json +3 -0
- package/packages/web/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/packages/web/.next/server/middleware-build-manifest.js +22 -0
- package/packages/web/.next/server/middleware-manifest.json +6 -0
- package/packages/web/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/packages/web/.next/server/next-font-manifest.js +1 -0
- package/packages/web/.next/server/next-font-manifest.json +1 -0
- package/packages/web/.next/server/pages-manifest.json +1 -0
- package/packages/web/.next/server/server-reference-manifest.js +1 -0
- package/packages/web/.next/server/server-reference-manifest.json +5 -0
- package/packages/web/.next/server/vendor-chunks/@swc.js +55 -0
- package/packages/web/.next/server/vendor-chunks/next.js +3010 -0
- package/packages/web/.next/server/webpack-runtime.js +209 -0
- package/packages/web/.next/static/chunks/app/layout.js +39 -0
- package/packages/web/.next/static/chunks/app/page.js +61 -0
- package/packages/web/.next/static/chunks/app-pages-internals.js +182 -0
- package/packages/web/.next/static/chunks/main-app.js +1882 -0
- package/packages/web/.next/static/chunks/polyfills.js +1 -0
- package/packages/web/.next/static/chunks/webpack.js +1393 -0
- package/packages/web/.next/static/css/app/layout.css +1237 -0
- package/packages/web/.next/static/development/_buildManifest.js +1 -0
- package/packages/web/.next/static/development/_ssgManifest.js +1 -0
- package/packages/web/.next/static/webpack/633457081244afec._.hot-update.json +1 -0
- package/packages/web/.next/static/webpack/6fee6306e0f98869.webpack.hot-update.json +1 -0
- package/packages/web/.next/static/webpack/73e341375c8d429e.webpack.hot-update.json +1 -0
- package/packages/web/.next/static/webpack/app/layout.6fee6306e0f98869.hot-update.js +22 -0
- package/packages/web/.next/static/webpack/app/layout.73e341375c8d429e.hot-update.js +22 -0
- package/packages/web/.next/static/webpack/app/page.6fee6306e0f98869.hot-update.js +22 -0
- package/packages/web/.next/static/webpack/app/page.73e341375c8d429e.hot-update.js +22 -0
- package/packages/web/.next/static/webpack/webpack.6fee6306e0f98869.hot-update.js +12 -0
- package/packages/web/.next/static/webpack/webpack.73e341375c8d429e.hot-update.js +12 -0
- package/packages/web/.next/trace +5 -0
- package/packages/web/.next/types/app/layout.ts +84 -0
- package/packages/web/.next/types/app/page.ts +84 -0
- package/packages/web/.next/types/cache-life.d.ts +141 -0
- package/packages/web/.next/types/package.json +1 -0
- package/packages/web/.next/types/routes.d.ts +57 -0
- package/packages/web/.next/types/validator.ts +61 -0
- package/packages/web/app/globals.css +75 -0
- package/packages/web/app/layout.tsx +26 -0
- package/packages/web/app/page.tsx +358 -0
- package/packages/web/bun.lock +300 -0
- package/packages/web/next-env.d.ts +6 -0
- package/packages/web/next.config.ts +5 -0
- package/packages/web/package.json +26 -0
- package/packages/web/postcss.config.mjs +8 -0
- package/packages/web/public/favicon.svg +5 -0
- package/packages/web/public/logo.svg +7 -0
- package/packages/web/tailwind.config.ts +48 -0
- package/packages/web/tsconfig.json +21 -0
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
|
|
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';
|
|
9
|
+
const BASESCAN = `https://sepolia.basescan.org/address/${CONTRACT}`;
|
|
10
|
+
|
|
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>
|
|
94
|
+
|
|
95
|
+
<div className="absolute bottom-0 left-0 right-0 h-32 bg-gradient-to-t from-bg to-transparent" />
|
|
96
|
+
</section>
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
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
|
+
},
|
|
114
|
+
{
|
|
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: '◎',
|
|
119
|
+
},
|
|
120
|
+
{
|
|
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: '▣',
|
|
125
|
+
},
|
|
126
|
+
{
|
|
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: '◬',
|
|
131
|
+
},
|
|
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
|
+
];
|
|
139
|
+
|
|
140
|
+
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>
|
|
148
|
+
</div>
|
|
149
|
+
|
|
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>
|
|
157
|
+
</div>
|
|
158
|
+
))}
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
</section>
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
|
|
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>
|
|
175
|
+
|
|
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>
|
|
190
|
+
</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
|
+
</div>
|
|
195
|
+
))}
|
|
196
|
+
</div>
|
|
197
|
+
</div>
|
|
198
|
+
|
|
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>
|
|
204
|
+
</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>
|
|
209
|
+
</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>
|
|
214
|
+
</div>
|
|
215
|
+
</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
|
+
];
|
|
232
|
+
|
|
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.
|
|
241
|
+
</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.
|
|
244
|
+
</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
|
+
</div>
|
|
249
|
+
|
|
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>
|
|
256
|
+
</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>
|
|
264
|
+
</div>
|
|
265
|
+
</div>
|
|
266
|
+
))}
|
|
267
|
+
</div>
|
|
268
|
+
</div>
|
|
269
|
+
</div>
|
|
270
|
+
</div>
|
|
271
|
+
</section>
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
|
|
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>
|
|
297
|
+
</div>
|
|
298
|
+
))}
|
|
299
|
+
</div>
|
|
300
|
+
|
|
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>
|
|
319
|
+
</div>
|
|
320
|
+
</div>
|
|
321
|
+
</section>
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
|
|
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>
|
|
339
|
+
</div>
|
|
340
|
+
<p className="text-xs text-muted/50">MIT License</p>
|
|
341
|
+
</div>
|
|
342
|
+
</footer>
|
|
343
|
+
);
|
|
344
|
+
}
|
|
345
|
+
|
|
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
|
+
}
|