opencode-code-archaeology 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.yml +63 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +48 -0
- package/.github/pull_request_template.md +27 -0
- package/.github/workflows/ci.yml +45 -0
- package/.github/workflows/release.yml +46 -0
- package/AGENTS.md +42 -10
- package/CHANGELOG.md +79 -0
- package/CONTRIBUTING.md +50 -0
- package/INSTALL.md +211 -0
- package/README.md +255 -71
- package/SECURITY.md +20 -0
- package/VERSION +1 -1
- package/assets/code-archaeology-banner.svg +195 -0
- package/commands/code-archaeology.md +7 -5
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +137 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +1 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -17
- package/dist/index.js.map +1 -1
- package/dist/platform.d.ts +4 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +11 -0
- package/dist/platform.js.map +1 -0
- package/dist/plugin.d.ts +3 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +3 -0
- package/dist/plugin.js.map +1 -0
- package/dist/runtime.d.ts +18 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +49 -0
- package/dist/runtime.js.map +1 -0
- package/dist/types.d.ts +1 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/docs/ARCHITECTURE.md +123 -0
- package/docs/INSTALL.md +156 -0
- package/docs/README.md +72 -0
- package/docs/RELEASE.md +139 -0
- package/docs/SECURITY_AUDIT.md +38 -0
- package/docs/index.html +740 -0
- package/hooks/hermes/runner.ps1 +247 -0
- package/hooks/hermes/runner.sh +262 -0
- package/hooks/hermes/setup.ps1 +41 -0
- package/hooks/hermes/setup.sh +41 -0
- package/hooks/opencode/init.ps1 +83 -0
- package/hooks/opencode/revert-phase.ps1 +12 -0
- package/hooks/opencode/revert-phase.sh +3 -8
- package/hooks/opencode/update-expedition.ps1 +51 -0
- package/hooks/opencode/verify-package.sh +47 -0
- package/hooks/opencode/verify-phase.ps1 +35 -0
- package/hooks/opencode/verify-phase.sh +7 -7
- package/hooks/shared/command-utils.ps1 +100 -0
- package/package.json +41 -6
- package/prompts/dead_code.md +45 -0
- package/prompts/dependencies.md +49 -0
- package/prompts/discovery.md +47 -0
- package/prompts/dry.md +49 -0
- package/prompts/errors.md +52 -0
- package/prompts/final_verify.md +58 -0
- package/prompts/legacy.md +49 -0
- package/prompts/polish.md +48 -0
- package/prompts/types_consolidate.md +48 -0
- package/prompts/types_harden.md +51 -0
- package/skills/code-archaeology/SKILL.md +2 -2
- package/skills/hermes/INTEGRATION.md +120 -0
- package/skills/hermes/README.md +167 -0
- package/skills/hermes/code-archaeology-prompt.md +203 -0
- package/wiki/Expedition-Workflow.md +34 -0
- package/wiki/Home.md +27 -0
- package/wiki/Installation.md +44 -0
- package/wiki/Release-Process.md +31 -0
- package/wiki/Security-and-Safety.md +21 -0
- package/plugins/code-archaeology.ts +0 -8
package/docs/index.html
ADDED
|
@@ -0,0 +1,740 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>Code Archaeology - OpenCode Technical Debt Excavation</title>
|
|
7
|
+
<meta
|
|
8
|
+
name="description"
|
|
9
|
+
content="Code Archaeology is an OpenCode plugin that surveys, catalogs, and safely restores codebases by excavating technical debt."
|
|
10
|
+
>
|
|
11
|
+
<style>
|
|
12
|
+
:root {
|
|
13
|
+
color-scheme: dark;
|
|
14
|
+
--bg: #06090f;
|
|
15
|
+
--panel: rgba(15, 23, 42, 0.82);
|
|
16
|
+
--panel-strong: rgba(15, 23, 42, 0.96);
|
|
17
|
+
--line: rgba(148, 163, 184, 0.22);
|
|
18
|
+
--text: #f8fafc;
|
|
19
|
+
--muted: #aab6c7;
|
|
20
|
+
--gold: #f6c453;
|
|
21
|
+
--amber: #d9952f;
|
|
22
|
+
--blue: #38bdf8;
|
|
23
|
+
--green: #22c55e;
|
|
24
|
+
--red: #f97373;
|
|
25
|
+
--shadow: 0 24px 80px rgba(0, 0, 0, 0.38);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
* {
|
|
29
|
+
box-sizing: border-box;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
html {
|
|
33
|
+
scroll-behavior: smooth;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
body {
|
|
37
|
+
margin: 0;
|
|
38
|
+
background:
|
|
39
|
+
radial-gradient(circle at 16% 10%, rgba(246, 196, 83, 0.14), transparent 24rem),
|
|
40
|
+
radial-gradient(circle at 85% 18%, rgba(56, 189, 248, 0.12), transparent 26rem),
|
|
41
|
+
linear-gradient(160deg, #05070c 0%, #0a1220 48%, #150c05 100%);
|
|
42
|
+
color: var(--text);
|
|
43
|
+
font-family:
|
|
44
|
+
Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
45
|
+
line-height: 1.6;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
a {
|
|
49
|
+
color: inherit;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.shell {
|
|
53
|
+
width: min(1180px, calc(100% - 36px));
|
|
54
|
+
margin: 0 auto;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.topbar {
|
|
58
|
+
position: sticky;
|
|
59
|
+
top: 0;
|
|
60
|
+
z-index: 20;
|
|
61
|
+
border-bottom: 1px solid var(--line);
|
|
62
|
+
background: rgba(6, 9, 15, 0.82);
|
|
63
|
+
backdrop-filter: blur(18px);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.topbar-inner {
|
|
67
|
+
display: flex;
|
|
68
|
+
align-items: center;
|
|
69
|
+
justify-content: space-between;
|
|
70
|
+
min-height: 72px;
|
|
71
|
+
gap: 24px;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.brand {
|
|
75
|
+
display: flex;
|
|
76
|
+
align-items: center;
|
|
77
|
+
gap: 12px;
|
|
78
|
+
font-weight: 800;
|
|
79
|
+
letter-spacing: 0.02em;
|
|
80
|
+
text-decoration: none;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.brand-mark {
|
|
84
|
+
display: grid;
|
|
85
|
+
place-items: center;
|
|
86
|
+
width: 42px;
|
|
87
|
+
height: 42px;
|
|
88
|
+
border: 1px solid rgba(246, 196, 83, 0.5);
|
|
89
|
+
border-radius: 14px;
|
|
90
|
+
background: linear-gradient(145deg, rgba(246, 196, 83, 0.22), rgba(56, 189, 248, 0.08));
|
|
91
|
+
box-shadow: 0 0 32px rgba(246, 196, 83, 0.12);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
nav {
|
|
95
|
+
display: flex;
|
|
96
|
+
align-items: center;
|
|
97
|
+
gap: 16px;
|
|
98
|
+
color: var(--muted);
|
|
99
|
+
font-size: 0.94rem;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
nav a {
|
|
103
|
+
text-decoration: none;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
nav a:hover {
|
|
107
|
+
color: var(--text);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.hero {
|
|
111
|
+
position: relative;
|
|
112
|
+
padding: 82px 0 56px;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.hero-grid {
|
|
116
|
+
display: grid;
|
|
117
|
+
grid-template-columns: minmax(0, 1.03fr) minmax(360px, 0.97fr);
|
|
118
|
+
align-items: center;
|
|
119
|
+
gap: 44px;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.eyebrow {
|
|
123
|
+
display: inline-flex;
|
|
124
|
+
align-items: center;
|
|
125
|
+
gap: 10px;
|
|
126
|
+
padding: 8px 12px;
|
|
127
|
+
border: 1px solid rgba(246, 196, 83, 0.28);
|
|
128
|
+
border-radius: 999px;
|
|
129
|
+
background: rgba(246, 196, 83, 0.08);
|
|
130
|
+
color: #fbdc8a;
|
|
131
|
+
font-size: 0.86rem;
|
|
132
|
+
font-weight: 700;
|
|
133
|
+
letter-spacing: 0.08em;
|
|
134
|
+
text-transform: uppercase;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
h1 {
|
|
138
|
+
max-width: 860px;
|
|
139
|
+
margin: 22px 0 16px;
|
|
140
|
+
font-size: clamp(3.2rem, 8vw, 7.2rem);
|
|
141
|
+
line-height: 0.92;
|
|
142
|
+
letter-spacing: -0.075em;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.gradient-text {
|
|
146
|
+
background: linear-gradient(105deg, #fff7d6 0%, #f6c453 36%, #38bdf8 78%);
|
|
147
|
+
-webkit-background-clip: text;
|
|
148
|
+
background-clip: text;
|
|
149
|
+
color: transparent;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.lede {
|
|
153
|
+
max-width: 690px;
|
|
154
|
+
margin: 0 0 28px;
|
|
155
|
+
color: var(--muted);
|
|
156
|
+
font-size: clamp(1.08rem, 2vw, 1.35rem);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.cta-row {
|
|
160
|
+
display: flex;
|
|
161
|
+
flex-wrap: wrap;
|
|
162
|
+
gap: 14px;
|
|
163
|
+
margin: 30px 0;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.button {
|
|
167
|
+
display: inline-flex;
|
|
168
|
+
align-items: center;
|
|
169
|
+
justify-content: center;
|
|
170
|
+
gap: 10px;
|
|
171
|
+
min-height: 48px;
|
|
172
|
+
padding: 0 18px;
|
|
173
|
+
border: 1px solid rgba(246, 196, 83, 0.42);
|
|
174
|
+
border-radius: 14px;
|
|
175
|
+
background: linear-gradient(135deg, #f6c453, #d9952f);
|
|
176
|
+
color: #0f172a;
|
|
177
|
+
font-weight: 800;
|
|
178
|
+
text-decoration: none;
|
|
179
|
+
box-shadow: 0 16px 36px rgba(217, 149, 47, 0.2);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.button.secondary {
|
|
183
|
+
background: rgba(15, 23, 42, 0.62);
|
|
184
|
+
color: var(--text);
|
|
185
|
+
border-color: var(--line);
|
|
186
|
+
box-shadow: none;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
code.inline-code {
|
|
190
|
+
padding: 0.15em 0.4em;
|
|
191
|
+
border: 1px solid rgba(148, 163, 184, 0.16);
|
|
192
|
+
border-radius: 0.45em;
|
|
193
|
+
background: rgba(148, 163, 184, 0.12);
|
|
194
|
+
color: #e2e8f0;
|
|
195
|
+
font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
|
|
196
|
+
font-size: 0.92em;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.command-card {
|
|
200
|
+
margin-top: 22px;
|
|
201
|
+
border: 1px solid rgba(246, 196, 83, 0.28);
|
|
202
|
+
border-radius: 22px;
|
|
203
|
+
background: rgba(2, 6, 23, 0.78);
|
|
204
|
+
box-shadow: var(--shadow);
|
|
205
|
+
overflow: hidden;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.command-label {
|
|
209
|
+
display: flex;
|
|
210
|
+
align-items: center;
|
|
211
|
+
justify-content: space-between;
|
|
212
|
+
gap: 16px;
|
|
213
|
+
padding: 14px 16px;
|
|
214
|
+
border-bottom: 1px solid var(--line);
|
|
215
|
+
color: #fbdc8a;
|
|
216
|
+
font-size: 0.84rem;
|
|
217
|
+
font-weight: 800;
|
|
218
|
+
letter-spacing: 0.08em;
|
|
219
|
+
text-transform: uppercase;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.copy-button {
|
|
223
|
+
cursor: pointer;
|
|
224
|
+
border: 1px solid rgba(148, 163, 184, 0.28);
|
|
225
|
+
border-radius: 999px;
|
|
226
|
+
background: rgba(148, 163, 184, 0.08);
|
|
227
|
+
color: var(--text);
|
|
228
|
+
font: inherit;
|
|
229
|
+
font-size: 0.76rem;
|
|
230
|
+
font-weight: 800;
|
|
231
|
+
padding: 7px 11px;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
pre {
|
|
235
|
+
margin: 0;
|
|
236
|
+
padding: 18px;
|
|
237
|
+
overflow-x: auto;
|
|
238
|
+
color: #dbeafe;
|
|
239
|
+
font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
|
|
240
|
+
font-size: 0.92rem;
|
|
241
|
+
line-height: 1.55;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.artifact-card {
|
|
245
|
+
position: relative;
|
|
246
|
+
min-height: 520px;
|
|
247
|
+
border: 1px solid rgba(148, 163, 184, 0.2);
|
|
248
|
+
border-radius: 32px;
|
|
249
|
+
background:
|
|
250
|
+
linear-gradient(180deg, rgba(15, 23, 42, 0.9), rgba(20, 12, 5, 0.9)),
|
|
251
|
+
radial-gradient(circle at 50% 20%, rgba(246, 196, 83, 0.18), transparent 18rem);
|
|
252
|
+
box-shadow: var(--shadow);
|
|
253
|
+
overflow: hidden;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.artifact-card::before,
|
|
257
|
+
.artifact-card::after {
|
|
258
|
+
content: "";
|
|
259
|
+
position: absolute;
|
|
260
|
+
right: -12%;
|
|
261
|
+
left: -8%;
|
|
262
|
+
height: 130px;
|
|
263
|
+
border-radius: 50% 50% 0 0;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
.artifact-card::before {
|
|
267
|
+
bottom: 42px;
|
|
268
|
+
background: rgba(91, 55, 23, 0.92);
|
|
269
|
+
transform: rotate(-3deg);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.artifact-card::after {
|
|
273
|
+
bottom: -8px;
|
|
274
|
+
background: linear-gradient(90deg, #8b5a2b, #e0b15b, #8b5a2b);
|
|
275
|
+
transform: rotate(2deg);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
.artifact-inner {
|
|
279
|
+
position: relative;
|
|
280
|
+
z-index: 2;
|
|
281
|
+
padding: 34px;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
.tablet {
|
|
285
|
+
width: min(280px, 75%);
|
|
286
|
+
margin: 18px auto 34px;
|
|
287
|
+
filter: drop-shadow(0 30px 45px rgba(0, 0, 0, 0.35));
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.status-grid {
|
|
291
|
+
display: grid;
|
|
292
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
293
|
+
gap: 12px;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
.status {
|
|
297
|
+
padding: 14px;
|
|
298
|
+
border: 1px solid rgba(148, 163, 184, 0.18);
|
|
299
|
+
border-radius: 18px;
|
|
300
|
+
background: rgba(2, 6, 23, 0.62);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
.status strong {
|
|
304
|
+
display: block;
|
|
305
|
+
margin-bottom: 2px;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.status span {
|
|
309
|
+
color: var(--muted);
|
|
310
|
+
font-size: 0.9rem;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
section {
|
|
314
|
+
padding: 62px 0;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
.section-head {
|
|
318
|
+
display: flex;
|
|
319
|
+
align-items: end;
|
|
320
|
+
justify-content: space-between;
|
|
321
|
+
gap: 24px;
|
|
322
|
+
margin-bottom: 24px;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
h2 {
|
|
326
|
+
margin: 0;
|
|
327
|
+
font-size: clamp(2rem, 4vw, 3.7rem);
|
|
328
|
+
line-height: 1;
|
|
329
|
+
letter-spacing: -0.055em;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
.section-head p,
|
|
333
|
+
.muted {
|
|
334
|
+
color: var(--muted);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
.cards {
|
|
338
|
+
display: grid;
|
|
339
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
340
|
+
gap: 16px;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
.card {
|
|
344
|
+
border: 1px solid var(--line);
|
|
345
|
+
border-radius: 24px;
|
|
346
|
+
background: var(--panel);
|
|
347
|
+
box-shadow: 0 16px 55px rgba(0, 0, 0, 0.18);
|
|
348
|
+
padding: 24px;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
.card h3 {
|
|
352
|
+
margin: 0 0 9px;
|
|
353
|
+
font-size: 1.18rem;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
.card p {
|
|
357
|
+
margin: 0;
|
|
358
|
+
color: var(--muted);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
.pill {
|
|
362
|
+
display: inline-flex;
|
|
363
|
+
margin-bottom: 18px;
|
|
364
|
+
padding: 7px 10px;
|
|
365
|
+
border-radius: 999px;
|
|
366
|
+
background: rgba(56, 189, 248, 0.1);
|
|
367
|
+
color: #bae6fd;
|
|
368
|
+
font-size: 0.8rem;
|
|
369
|
+
font-weight: 800;
|
|
370
|
+
letter-spacing: 0.06em;
|
|
371
|
+
text-transform: uppercase;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
.flow {
|
|
375
|
+
border: 1px solid var(--line);
|
|
376
|
+
border-radius: 28px;
|
|
377
|
+
background: var(--panel-strong);
|
|
378
|
+
box-shadow: var(--shadow);
|
|
379
|
+
padding: 24px;
|
|
380
|
+
overflow: hidden;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
.flow svg {
|
|
384
|
+
display: block;
|
|
385
|
+
width: 100%;
|
|
386
|
+
height: auto;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
.split {
|
|
390
|
+
display: grid;
|
|
391
|
+
grid-template-columns: minmax(0, 0.9fr) minmax(360px, 1.1fr);
|
|
392
|
+
gap: 18px;
|
|
393
|
+
align-items: stretch;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
.steps {
|
|
397
|
+
display: grid;
|
|
398
|
+
gap: 12px;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
.step {
|
|
402
|
+
display: grid;
|
|
403
|
+
grid-template-columns: 44px minmax(0, 1fr);
|
|
404
|
+
gap: 14px;
|
|
405
|
+
align-items: start;
|
|
406
|
+
padding: 18px;
|
|
407
|
+
border: 1px solid var(--line);
|
|
408
|
+
border-radius: 20px;
|
|
409
|
+
background: rgba(15, 23, 42, 0.66);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
.step-number {
|
|
413
|
+
display: grid;
|
|
414
|
+
place-items: center;
|
|
415
|
+
width: 44px;
|
|
416
|
+
height: 44px;
|
|
417
|
+
border-radius: 16px;
|
|
418
|
+
background: rgba(246, 196, 83, 0.14);
|
|
419
|
+
color: #fbdc8a;
|
|
420
|
+
font-weight: 900;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
.step h3 {
|
|
424
|
+
margin: 0 0 3px;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
.step p {
|
|
428
|
+
margin: 0;
|
|
429
|
+
color: var(--muted);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
.install-grid {
|
|
433
|
+
display: grid;
|
|
434
|
+
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
|
|
435
|
+
gap: 16px;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
.warning {
|
|
439
|
+
border-color: rgba(249, 115, 115, 0.34);
|
|
440
|
+
background: linear-gradient(135deg, rgba(249, 115, 115, 0.1), rgba(15, 23, 42, 0.82));
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
footer {
|
|
444
|
+
padding: 46px 0 70px;
|
|
445
|
+
color: var(--muted);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
.footer-inner {
|
|
449
|
+
display: flex;
|
|
450
|
+
flex-wrap: wrap;
|
|
451
|
+
align-items: center;
|
|
452
|
+
justify-content: space-between;
|
|
453
|
+
gap: 18px;
|
|
454
|
+
border-top: 1px solid var(--line);
|
|
455
|
+
padding-top: 24px;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
.footer-links {
|
|
459
|
+
display: flex;
|
|
460
|
+
flex-wrap: wrap;
|
|
461
|
+
gap: 14px;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
.footer-links a {
|
|
465
|
+
color: var(--muted);
|
|
466
|
+
text-decoration: none;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
@media (max-width: 900px) {
|
|
470
|
+
.hero-grid,
|
|
471
|
+
.split,
|
|
472
|
+
.install-grid,
|
|
473
|
+
.cards {
|
|
474
|
+
grid-template-columns: 1fr;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
nav {
|
|
478
|
+
display: none;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
.artifact-card {
|
|
482
|
+
min-height: auto;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
.section-head {
|
|
486
|
+
display: block;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
@media (max-width: 560px) {
|
|
491
|
+
.shell {
|
|
492
|
+
width: min(100% - 24px, 1180px);
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
.hero {
|
|
496
|
+
padding-top: 46px;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
h1 {
|
|
500
|
+
font-size: clamp(3rem, 18vw, 4.5rem);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
.status-grid {
|
|
504
|
+
grid-template-columns: 1fr;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
</style>
|
|
508
|
+
</head>
|
|
509
|
+
<body>
|
|
510
|
+
<header class="topbar">
|
|
511
|
+
<div class="shell topbar-inner">
|
|
512
|
+
<a class="brand" href="#top" aria-label="Code Archaeology home">
|
|
513
|
+
<span class="brand-mark" aria-hidden="true">
|
|
514
|
+
<svg width="25" height="25" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
515
|
+
<path d="M7 5h16l-3 18H10L7 5Z" fill="#111827" stroke="#f6c453" stroke-width="2"/>
|
|
516
|
+
<path d="M12 10h7M12 15h6M12 20h4" stroke="#e2e8f0" stroke-width="2" stroke-linecap="round"/>
|
|
517
|
+
<path d="M20 21l6 6" stroke="#38bdf8" stroke-width="3" stroke-linecap="round"/>
|
|
518
|
+
</svg>
|
|
519
|
+
</span>
|
|
520
|
+
<span>Code Archaeology</span>
|
|
521
|
+
</a>
|
|
522
|
+
<nav aria-label="Primary navigation">
|
|
523
|
+
<a href="#install">Install</a>
|
|
524
|
+
<a href="#flow">Flow</a>
|
|
525
|
+
<a href="#safety">Safety</a>
|
|
526
|
+
<a href="https://github.com/Maleick/Code-Archaeology">GitHub</a>
|
|
527
|
+
<a href="https://www.npmjs.com/package/opencode-code-archaeology">npm</a>
|
|
528
|
+
</nav>
|
|
529
|
+
</div>
|
|
530
|
+
</header>
|
|
531
|
+
|
|
532
|
+
<main id="top">
|
|
533
|
+
<section class="hero">
|
|
534
|
+
<div class="shell hero-grid">
|
|
535
|
+
<div>
|
|
536
|
+
<span class="eyebrow">OpenCode plugin</span>
|
|
537
|
+
<h1><span class="gradient-text">Excavate technical debt.</span> <br><span>Restore with confidence.</span></h1>
|
|
538
|
+
<p class="lede">
|
|
539
|
+
Code Archaeology surveys your repository, catalogs the strata of accumulated debt,
|
|
540
|
+
and applies restoration work only after review, verification, and test gates.
|
|
541
|
+
</p>
|
|
542
|
+
<div class="cta-row">
|
|
543
|
+
<a class="button" href="#install">Install in OpenCode</a>
|
|
544
|
+
<a class="button secondary" href="https://github.com/Maleick/Code-Archaeology">View repository</a>
|
|
545
|
+
</div>
|
|
546
|
+
|
|
547
|
+
<div class="command-card" id="install">
|
|
548
|
+
<div class="command-label">
|
|
549
|
+
<span>OpenCode one-line handoff</span>
|
|
550
|
+
<button class="copy-button" type="button" data-copy="Fetch and follow instructions from https://raw.githubusercontent.com/Maleick/Code-Archaeology/refs/heads/main/INSTALL.md">Copy</button>
|
|
551
|
+
</div>
|
|
552
|
+
<pre><code>Fetch and follow instructions from https://raw.githubusercontent.com/Maleick/Code-Archaeology/refs/heads/main/INSTALL.md</code></pre>
|
|
553
|
+
</div>
|
|
554
|
+
</div>
|
|
555
|
+
|
|
556
|
+
<aside class="artifact-card" aria-label="Code Archaeology capability graphic">
|
|
557
|
+
<div class="artifact-inner">
|
|
558
|
+
<svg class="tablet" viewBox="0 0 280 260" role="img" aria-labelledby="tablet-title tablet-desc" xmlns="http://www.w3.org/2000/svg">
|
|
559
|
+
<title id="tablet-title">Archaeology tablet and scanner</title>
|
|
560
|
+
<desc id="tablet-desc">An excavation tablet representing code reports, with a scanner representing safe restoration.</desc>
|
|
561
|
+
<defs>
|
|
562
|
+
<linearGradient id="tabletFill" x1="0" y1="0" x2="0" y2="1">
|
|
563
|
+
<stop offset="0" stop-color="#334155"/>
|
|
564
|
+
<stop offset="1" stop-color="#0f172a"/>
|
|
565
|
+
</linearGradient>
|
|
566
|
+
<linearGradient id="scanner" x1="0" y1="0" x2="1" y2="1">
|
|
567
|
+
<stop offset="0" stop-color="#f6c453"/>
|
|
568
|
+
<stop offset="1" stop-color="#38bdf8"/>
|
|
569
|
+
</linearGradient>
|
|
570
|
+
</defs>
|
|
571
|
+
<path d="M70 12l115 30-23 158H42L15 42 70 12Z" fill="url(#tabletFill)" stroke="#94a3b8" stroke-width="4"/>
|
|
572
|
+
<circle cx="76" cy="45" r="10" fill="#f6c453"/>
|
|
573
|
+
<path d="M58 82h86M62 112h100M67 142h74" stroke="#e2e8f0" stroke-width="8" stroke-linecap="round" opacity=".8"/>
|
|
574
|
+
<path d="M154 176l55 55" stroke="url(#scanner)" stroke-width="16" stroke-linecap="round"/>
|
|
575
|
+
<path d="M196 238l58-58" stroke="url(#scanner)" stroke-width="16" stroke-linecap="round"/>
|
|
576
|
+
<path d="M205 170c21-22 57-20 75 3l-42 42-33-45Z" fill="#020617" stroke="#f6c453" stroke-width="7"/>
|
|
577
|
+
</svg>
|
|
578
|
+
<div class="status-grid">
|
|
579
|
+
<div class="status"><strong>Survey</strong> <span>reports only</span></div>
|
|
580
|
+
<div class="status"><strong>Excavate</strong> <span>mock patches</span></div>
|
|
581
|
+
<div class="status"><strong>Restore</strong> <span>test-gated edits</span></div>
|
|
582
|
+
<div class="status"><strong>Catalog</strong> <span>final preservation</span></div>
|
|
583
|
+
</div>
|
|
584
|
+
</div>
|
|
585
|
+
</aside>
|
|
586
|
+
</div>
|
|
587
|
+
</section>
|
|
588
|
+
|
|
589
|
+
<section>
|
|
590
|
+
<div class="shell section-head">
|
|
591
|
+
<div>
|
|
592
|
+
<span class="eyebrow">Why it exists</span>
|
|
593
|
+
<h2>Technical debt cleanup with an audit trail.</h2>
|
|
594
|
+
</div>
|
|
595
|
+
<p>Start with evidence. Review the site report. Restore only what can be verified.</p>
|
|
596
|
+
</div>
|
|
597
|
+
<div class="shell cards">
|
|
598
|
+
<article class="card">
|
|
599
|
+
<span class="pill">Catalog</span>
|
|
600
|
+
<h3>Find the buried layers</h3>
|
|
601
|
+
<p>Dead code, legacy fallbacks, circular dependencies, weak types, duplication, and defensive slop are cataloged before changes happen.</p>
|
|
602
|
+
</article>
|
|
603
|
+
<article class="card">
|
|
604
|
+
<span class="pill">Review</span>
|
|
605
|
+
<h3>Separate reports from edits</h3>
|
|
606
|
+
<p><code class="inline-code">survey</code> mode writes <code class="inline-code">.archaeology/</code> reports only. <code class="inline-code">excavate</code> adds mock patches for review. <code class="inline-code">restore</code> is the only mode that edits source files.</p>
|
|
607
|
+
</article>
|
|
608
|
+
<article class="card">
|
|
609
|
+
<span class="pill">Verify</span>
|
|
610
|
+
<h3>Gate every restoration</h3>
|
|
611
|
+
<p>Restore phases run tests and type checks between expeditions, then revert and stop if a phase introduces failures.</p>
|
|
612
|
+
</article>
|
|
613
|
+
</div>
|
|
614
|
+
</section>
|
|
615
|
+
|
|
616
|
+
<section id="flow">
|
|
617
|
+
<div class="shell section-head">
|
|
618
|
+
<div>
|
|
619
|
+
<span class="eyebrow">Expedition map</span>
|
|
620
|
+
<h2>From survey to final catalog.</h2>
|
|
621
|
+
</div>
|
|
622
|
+
<p>The order is fixed so cleanup does not hide evidence or break later analysis.</p>
|
|
623
|
+
</div>
|
|
624
|
+
<div class="shell flow">
|
|
625
|
+
<svg viewBox="0 0 1120 360" role="img" aria-labelledby="flow-title flow-desc" xmlns="http://www.w3.org/2000/svg">
|
|
626
|
+
<title id="flow-title">Code Archaeology expedition flow</title>
|
|
627
|
+
<desc id="flow-desc">A diagram showing survey, dead code, legacy, cycles, types, DRY, errors, polish, and final catalog phases.</desc>
|
|
628
|
+
<defs>
|
|
629
|
+
<linearGradient id="node" x1="0" y1="0" x2="1" y2="1">
|
|
630
|
+
<stop offset="0" stop-color="#172033"/>
|
|
631
|
+
<stop offset="1" stop-color="#0b1020"/>
|
|
632
|
+
</linearGradient>
|
|
633
|
+
<marker id="arrow" markerWidth="12" markerHeight="12" refX="8" refY="6" orient="auto">
|
|
634
|
+
<path d="M2 2l7 4-7 4V2Z" fill="#f6c453"/>
|
|
635
|
+
</marker>
|
|
636
|
+
</defs>
|
|
637
|
+
<rect width="1120" height="360" rx="24" fill="#070b14"/>
|
|
638
|
+
<g stroke="#f6c453" stroke-width="3" marker-end="url(#arrow)" opacity=".85">
|
|
639
|
+
<path d="M158 96h84"/>
|
|
640
|
+
<path d="M354 96h84"/>
|
|
641
|
+
<path d="M550 96h84"/>
|
|
642
|
+
<path d="M746 96h84"/>
|
|
643
|
+
<path d="M942 96v76"/>
|
|
644
|
+
<path d="M830 264h-84"/>
|
|
645
|
+
<path d="M634 264h-84"/>
|
|
646
|
+
<path d="M438 264h-84"/>
|
|
647
|
+
<path d="M242 264h-84"/>
|
|
648
|
+
</g>
|
|
649
|
+
<g font-family="Inter, Segoe UI, Arial, sans-serif" text-anchor="middle">
|
|
650
|
+
<g transform="translate(86 96)"><rect x="-72" y="-42" width="144" height="84" rx="20" fill="url(#node)" stroke="#334155"/><text y="-6" fill="#f8fafc" font-weight="800">1 Survey</text><text y="20" fill="#94a3b8" font-size="13">baseline report</text></g>
|
|
651
|
+
<g transform="translate(282 96)"><rect x="-72" y="-42" width="144" height="84" rx="20" fill="url(#node)" stroke="#334155"/><text y="-6" fill="#f8fafc" font-weight="800">2 Dead Code</text><text y="20" fill="#94a3b8" font-size="13">unused strata</text></g>
|
|
652
|
+
<g transform="translate(478 96)"><rect x="-72" y="-42" width="144" height="84" rx="20" fill="url(#node)" stroke="#334155"/><text y="-6" fill="#f8fafc" font-weight="800">3 Legacy</text><text y="20" fill="#94a3b8" font-size="13">old shims</text></g>
|
|
653
|
+
<g transform="translate(674 96)"><rect x="-72" y="-42" width="144" height="84" rx="20" fill="url(#node)" stroke="#334155"/><text y="-6" fill="#f8fafc" font-weight="800">4 Cycles</text><text y="20" fill="#94a3b8" font-size="13">dependency map</text></g>
|
|
654
|
+
<g transform="translate(870 96)"><rect x="-72" y="-42" width="144" height="84" rx="20" fill="url(#node)" stroke="#334155"/><text y="-6" fill="#f8fafc" font-weight="800">5 Types</text><text y="20" fill="#94a3b8" font-size="13">catalog repair</text></g>
|
|
655
|
+
<g transform="translate(870 264)"><rect x="-72" y="-42" width="144" height="84" rx="20" fill="url(#node)" stroke="#334155"/><text y="-6" fill="#f8fafc" font-weight="800">6 Harden</text><text y="20" fill="#94a3b8" font-size="13">no guessing</text></g>
|
|
656
|
+
<g transform="translate(674 264)"><rect x="-72" y="-42" width="144" height="84" rx="20" fill="url(#node)" stroke="#334155"/><text y="-6" fill="#f8fafc" font-weight="800">7 DRY</text><text y="20" fill="#94a3b8" font-size="13">dedupe safely</text></g>
|
|
657
|
+
<g transform="translate(478 264)"><rect x="-72" y="-42" width="144" height="84" rx="20" fill="url(#node)" stroke="#334155"/><text y="-6" fill="#f8fafc" font-weight="800">8 Errors</text><text y="20" fill="#94a3b8" font-size="13">keep boundaries</text></g>
|
|
658
|
+
<g transform="translate(282 264)"><rect x="-72" y="-42" width="144" height="84" rx="20" fill="url(#node)" stroke="#334155"/><text y="-6" fill="#f8fafc" font-weight="800">9 Polish</text><text y="20" fill="#94a3b8" font-size="13">clean artifacts</text></g>
|
|
659
|
+
<g transform="translate(86 264)"><rect x="-72" y="-42" width="144" height="84" rx="20" fill="#1f1609" stroke="#f6c453"/><text y="-6" fill="#f8fafc" font-weight="800">10 Catalog</text><text y="20" fill="#fbdc8a" font-size="13">preserve site</text></g>
|
|
660
|
+
</g>
|
|
661
|
+
</svg>
|
|
662
|
+
</div>
|
|
663
|
+
</section>
|
|
664
|
+
|
|
665
|
+
<section id="safety">
|
|
666
|
+
<div class="shell split">
|
|
667
|
+
<div class="card warning">
|
|
668
|
+
<span class="pill">Safety model</span>
|
|
669
|
+
<h2>Reports first. Edits last.</h2>
|
|
670
|
+
<p class="muted">
|
|
671
|
+
Code Archaeology treats your repository like a site under excavation. It records evidence,
|
|
672
|
+
asks for review, and only modifies source files when restore mode is deliberately selected.
|
|
673
|
+
</p>
|
|
674
|
+
</div>
|
|
675
|
+
<div class="steps">
|
|
676
|
+
<div class="step"><div class="step-number">01</div><div><h3>Survey</h3> <p>Generate <code class="inline-code">.archaeology/</code> reports without touching source files.</p></div></div>
|
|
677
|
+
<div class="step"><div class="step-number">02</div><div><h3>Excavate</h3> <p>Create reports and mock patches so humans can inspect intended changes.</p></div></div>
|
|
678
|
+
<div class="step"><div class="step-number">03</div><div><h3>Restore</h3> <p>Apply approved changes on an isolated branch with test and type-check gates.</p></div></div>
|
|
679
|
+
<div class="step"><div class="step-number">04</div><div><h3>Revert on failure</h3> <p>If verification fails, the phase is reverted and the expedition stops.</p></div></div>
|
|
680
|
+
</div>
|
|
681
|
+
</div>
|
|
682
|
+
</section>
|
|
683
|
+
|
|
684
|
+
<section>
|
|
685
|
+
<div class="shell section-head">
|
|
686
|
+
<div>
|
|
687
|
+
<span class="eyebrow">Install paths</span>
|
|
688
|
+
<h2>One handoff for agents. One command chain for terminals.</h2>
|
|
689
|
+
</div>
|
|
690
|
+
</div>
|
|
691
|
+
<div class="shell install-grid">
|
|
692
|
+
<div class="command-card">
|
|
693
|
+
<div class="command-label">
|
|
694
|
+
<span>Tell OpenCode</span>
|
|
695
|
+
<button class="copy-button" type="button" data-copy="Fetch and follow instructions from https://raw.githubusercontent.com/Maleick/Code-Archaeology/refs/heads/main/INSTALL.md">Copy</button>
|
|
696
|
+
</div>
|
|
697
|
+
<pre><code>Fetch and follow instructions from https://raw.githubusercontent.com/Maleick/Code-Archaeology/refs/heads/main/INSTALL.md</code></pre>
|
|
698
|
+
</div>
|
|
699
|
+
<div class="command-card">
|
|
700
|
+
<div class="command-label">
|
|
701
|
+
<span>Install with npm</span>
|
|
702
|
+
<button class="copy-button" type="button" data-copy="npm install -g opencode-code-archaeology && opencode-code-archaeology install && opencode-code-archaeology doctor">Copy</button>
|
|
703
|
+
</div>
|
|
704
|
+
<pre><code>npm install -g opencode-code-archaeology && opencode-code-archaeology install && opencode-code-archaeology doctor</code></pre>
|
|
705
|
+
</div>
|
|
706
|
+
</div>
|
|
707
|
+
</section>
|
|
708
|
+
</main>
|
|
709
|
+
|
|
710
|
+
<footer>
|
|
711
|
+
<div class="shell footer-inner">
|
|
712
|
+
<div>Code Archaeology - Excavate technical debt. Restore with confidence.</div>
|
|
713
|
+
<div class="footer-links">
|
|
714
|
+
<a href="README.md">Docs</a>
|
|
715
|
+
<a href="INSTALL.md">Install guide</a>
|
|
716
|
+
<a href="https://github.com/Maleick/Code-Archaeology/wiki">Wiki</a>
|
|
717
|
+
<a href="https://github.com/Maleick/Code-Archaeology/releases">Releases</a>
|
|
718
|
+
</div>
|
|
719
|
+
</div>
|
|
720
|
+
</footer>
|
|
721
|
+
|
|
722
|
+
<script>
|
|
723
|
+
for (const button of document.querySelectorAll('[data-copy]')) {
|
|
724
|
+
button.addEventListener('click', async () => {
|
|
725
|
+
const text = button.getAttribute('data-copy') || '';
|
|
726
|
+
try {
|
|
727
|
+
await navigator.clipboard.writeText(text);
|
|
728
|
+
const original = button.textContent;
|
|
729
|
+
button.textContent = 'Copied';
|
|
730
|
+
setTimeout(() => {
|
|
731
|
+
button.textContent = original;
|
|
732
|
+
}, 1400);
|
|
733
|
+
} catch {
|
|
734
|
+
button.textContent = 'Select text';
|
|
735
|
+
}
|
|
736
|
+
});
|
|
737
|
+
}
|
|
738
|
+
</script>
|
|
739
|
+
</body>
|
|
740
|
+
</html>
|