workproof 0.1.3 → 0.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/README.md +322 -101
- package/README.tr.md +270 -77
- package/dist/src/analyse.d.ts +39 -2
- package/dist/src/analyse.js +98 -12
- package/dist/src/attest.d.ts +62 -0
- package/dist/src/attest.js +72 -0
- package/dist/src/badge.js +4 -4
- package/dist/src/canonical.d.ts +9 -0
- package/dist/src/canonical.js +27 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.js +110 -8
- package/dist/src/exclusions.d.ts +24 -0
- package/dist/src/exclusions.js +80 -0
- package/dist/src/figures/authorship.d.ts +53 -0
- package/dist/src/figures/authorship.js +190 -0
- package/dist/src/figures/footprint.d.ts +5 -1
- package/dist/src/figures/footprint.js +14 -9
- package/dist/src/figures/surviving.d.ts +38 -2
- package/dist/src/figures/surviving.js +82 -11
- package/dist/src/git.d.ts +24 -2
- package/dist/src/git.js +70 -13
- package/dist/src/index.d.ts +8 -4
- package/dist/src/index.js +6 -3
- package/dist/src/report.d.ts +5 -1
- package/dist/src/report.js +35 -13
- package/dist/src/schema.d.ts +4 -0
- package/dist/src/schema.js +66 -0
- package/dist/src/summary.d.ts +11 -0
- package/dist/src/summary.js +47 -0
- package/dist/src/verify.d.ts +29 -3
- package/dist/src/verify.js +38 -6
- package/package.json +32 -8
- package/schema/report.schema.json +74 -0
package/README.tr.md
CHANGED
|
@@ -11,9 +11,10 @@
|
|
|
11
11
|
</p>
|
|
12
12
|
|
|
13
13
|
workproof, bir git deposunu tek bir yazar için doğrulanabilir bir mühendislik raporuna
|
|
14
|
-
çevirir; hiçbir kod göstermeden. Paylaşamadığınız depoda çalıştırırsınız. Okuyan kişi
|
|
15
|
-
figür, her birinin arkasındaki tam komutu, her birinin neyi gösteremediğini ve
|
|
16
|
-
|
|
14
|
+
çevirir; hiçbir kod göstermeden. Paylaşamadığınız depoda çalıştırırsınız. Okuyan kişi on üç
|
|
15
|
+
figür, her birinin arkasındaki tam komutu, her birinin neyi gösteremediğini ve herkesin
|
|
16
|
+
çevrimdışı yeniden hesaplayabileceği bir hash alır. Bir verimlilik ölçütü değildir: neyin
|
|
17
|
+
hayatta kaldığını ve neye dokunulduğunu ölçer, her sayının altına kendi sınırlarını yazar.
|
|
17
18
|
|
|
18
19
|
## 30 saniye
|
|
19
20
|
|
|
@@ -23,148 +24,338 @@ npx workproof
|
|
|
23
24
|
```
|
|
24
25
|
|
|
25
26
|
Bu, `workproof-report.md` (bir özgeçmişe, portfolyoya, vize başvurusuna yapıştırın) ve
|
|
26
|
-
`workproof-report.json` (araçlar ve doğrulama için) dosyalarını yazar.
|
|
27
|
-
|
|
27
|
+
`workproof-report.json` (araçlar ve doğrulama için) dosyalarını yazar. Aşağıdaki örneğin
|
|
28
|
+
arkasındaki gerçek çalıştırma, [langchain-ai/openwiki](https://github.com/langchain-ai/openwiki)
|
|
29
|
+
deposunun `1e6d54c` sürümünde:
|
|
28
30
|
|
|
29
31
|
```
|
|
30
|
-
npx workproof
|
|
32
|
+
$ npx workproof --author "Colin Francis" --sample 5
|
|
33
|
+
fingerprint key 9dc900a6227a1faaaa17d774565afbf3 (keep it to compare reports or to verify the fingerprint; it is not stored)
|
|
34
|
+
openwiki: reading history...
|
|
35
|
+
openwiki: 369 commits read
|
|
36
|
+
openwiki: blaming files (1 in 5 sample)...
|
|
37
|
+
openwiki: blamed 123 of 547 files
|
|
38
|
+
wrote workproof-report.md and workproof-report.json in 2.7s
|
|
39
|
+
|
|
40
|
+
$ npx workproof check workproof-report.json
|
|
41
|
+
schema ok
|
|
42
|
+
hash ok 63d4fd1373b06b090086a653d52dfed234edcf35645bce3a34137a0447049355
|
|
43
|
+
|
|
44
|
+
$ npx workproof verify workproof-report.json --fingerprint-key 9dc900a6227a1faaaa17d774565afbf3
|
|
45
|
+
schema ok
|
|
46
|
+
hash ok 63d4fd1373b06b090086a653d52dfed234edcf35645bce3a34137a0447049355
|
|
47
|
+
openwiki: fingerprint ok
|
|
48
|
+
all figures reproduce
|
|
31
49
|
```
|
|
32
50
|
|
|
51
|
+
`check` için yalnızca JSON gerekir. `verify` için depo gerekir.
|
|
52
|
+
|
|
33
53
|
## Bir rapor neye benzer
|
|
34
54
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
55
|
+
openwiki deposunun `1e6d54c` sürümünde bir bakımcı için 5 Eylül 2026'da
|
|
56
|
+
`--author "Colin Francis" --sample 5` ile alınan gerçek çıktı; yollar ve e-postalar gizli
|
|
57
|
+
(varsayılanlar). Tam raporda her figürün altında git komutuyla `How:` ve
|
|
58
|
+
`What this cannot show:` satırları da vardır; burada yer için kesildi.
|
|
38
59
|
|
|
39
60
|
```
|
|
40
61
|
## openwiki
|
|
41
62
|
|
|
42
|
-
HEAD 1e6d54cdfeec · fingerprint
|
|
63
|
+
HEAD 1e6d54cdfeec · fingerprint a1b19a27aab4a577 · identities: Colin Francis
|
|
64
|
+
|
|
65
|
+
excluded 64 bot commits and 1 generated, vendored or lock file (2.2% of lines added)
|
|
43
66
|
|
|
44
67
|
### Tenure window
|
|
45
68
|
2026-07-06 to 2026-09-03 (60 days)
|
|
46
69
|
|
|
47
70
|
### Share of commits in tenure
|
|
48
|
-
71 of
|
|
71
|
+
71 of 233 non-merge commits, 30.5%
|
|
49
72
|
|
|
50
73
|
### Cadence
|
|
51
74
|
9 active weeks of 9, 7.9 commits per active week, longest streak 9 weeks
|
|
52
75
|
1 of 21 release tags in tenure
|
|
53
76
|
|
|
54
77
|
### Footprint
|
|
55
|
-
|
|
78
|
+
693 files touched
|
|
56
79
|
16 directories with a commit share at or above the threshold (paths hidden; run with --paths)
|
|
57
|
-
languages by lines added: TypeScript
|
|
80
|
+
languages by lines added: TypeScript 81.4%, JSON 9.7%, Markdown 7.1%, JavaScript 1.6%, YAML 0.2%
|
|
81
|
+
|
|
82
|
+
### Test-file changes and documents created
|
|
83
|
+
393 of 656 test-file changes, 59.9%
|
|
84
|
+
101 documents created
|
|
85
|
+
|
|
86
|
+
### Files authored
|
|
87
|
+
455 of 555 files alive at HEAD, 82.0% (degree of authorship)
|
|
88
|
+
|
|
89
|
+
### Major-contributor components
|
|
90
|
+
major contributor in 59 of 65 directories (at least 5% of commits)
|
|
91
|
+
|
|
92
|
+
### Commit size
|
|
93
|
+
median 166 lines, 90th percentile 9,234, 6 commits over 10,000 lines
|
|
58
94
|
|
|
59
|
-
###
|
|
60
|
-
|
|
61
|
-
|
|
95
|
+
### Co-authored commits
|
|
96
|
+
119 commits by others naming the author in a Co-authored-by trailer
|
|
97
|
+
|
|
98
|
+
### Absence factor
|
|
99
|
+
4 authors cover half the commits; the author ranks 1 of 71 by commit count
|
|
100
|
+
|
|
101
|
+
### AI-assisted commits
|
|
102
|
+
1 commit declares an AI tool in a trailer, 1.4% of the author's commits
|
|
62
103
|
|
|
63
104
|
### Surviving lines at HEAD
|
|
64
|
-
23,317 of 33,038 surviving lines, 70.6% (files 123/
|
|
65
|
-
```
|
|
105
|
+
23,317 of 33,038 surviving lines, 70.6% (files 123/547, sample 1 in 5)
|
|
66
106
|
|
|
67
|
-
|
|
68
|
-
|
|
107
|
+
### Survival by cohort
|
|
108
|
+
2026: 23,317 lines
|
|
109
|
+
```
|
|
69
110
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
111
|
+
İlk satırı ve iki payı birlikte okuyun. Altmış dört bot commit'i daha hiçbir şey
|
|
112
|
+
sayılmadan paydadan çıktı; bu, aynı kişinin eski sürümde %24,1 görünen commit payını
|
|
113
|
+
%30,5'e taşıdı. Penceresindeki insan commit'lerinin %30,5'ini ve hâlâ yaşayan satırların
|
|
114
|
+
%70,6'sını yazmış. Tek başına commit sayısı onu yetmiş bir katkıcıdan biri diye
|
|
115
|
+
adlandırırdı. Bu boşluk, iki yönde de, bir raporun birinin işi hakkında söyleyebileceği en
|
|
116
|
+
dürüst şeydir.
|
|
73
117
|
|
|
74
118
|
## Ne ölçer
|
|
75
119
|
|
|
76
|
-
|
|
120
|
+
Her figür git'ten gelir, başka hiçbir şeyden değil. Bot commit'leri ile üretilmiş, vendored,
|
|
121
|
+
kilit ve snapshot dosyaları hiçbir figür hesaplanmadan önce çıkarılır (bkz. Oyun ve yanlılık).
|
|
77
122
|
|
|
78
123
|
| figür | ne | neyi gösteremez |
|
|
79
124
|
|---|---|---|
|
|
80
125
|
| Görev penceresi | yazarın ilk ve son commit'i, ya da `--since/--until` | ilk commit'ten önceki ya da sonuncudan sonraki iş |
|
|
81
|
-
| Commit payı | penceredeki merge dışı commit'
|
|
126
|
+
| Commit payı | penceredeki insan merge dışı commit'leri içinde yazarınkiler | neyin sağ kaldığı; bir yazım hatası ile bir alt sistem aynı sayılır |
|
|
82
127
|
| Tempo | aktif haftalar, aktif hafta başına commit, en uzun seri, penceredeki sürüm etiketleri ve yazarınkiler | bir commit'lik hafta ile kırk commit'lik hafta ikisi de aktif sayılır |
|
|
83
|
-
| Ayak izi | dokunulan dosyalar, commit payı eşiğin üstündeki dizinler, eklenen satıra göre diller |
|
|
84
|
-
|
|
|
85
|
-
|
|
|
128
|
+
| Ayak izi | dokunulan dosyalar, commit payı eşiğin üstündeki dizinler, eklenen satıra göre diller | dışlama listelerinin kaçırdığı her şey yine sayılır |
|
|
129
|
+
| Test dosyası değişiklikleri ve oluşturulan dokümanlar | test dosyası değişikliklerinin payı; en eski commit'i yazara ait `.md`, `.mdx`, `.rst` dosyaları | test vakaları, kapsam ya da bir dokümanın kalitesi |
|
|
130
|
+
| Yazarı olunan dosyalar | HEAD'de yaşayan ve yazarın yazarlık derecesinin (Avelino ve ark.) en az 3,293 ve dosya maksimumunun %75'inin üstünde olduğu dosyalar | katsayılar başka sistemlerde uydurulmuştur; ilk yazarlık sonraki yeniden yazımlardan ağır basar |
|
|
131
|
+
| Ana katkıcı olunan bileşenler | yazarın commit'lerin en az %5'ine sahip olduğu dizinler (Bird ve ark.) | commit teması bir yazım hatası ile bir alt sistemi aynı görür |
|
|
132
|
+
| Commit büyüklüğü | commit başına eklenen artı silinen satırın medyanı ve 90. yüzdeliği; 10.000 satırı aşan commit'ler | büyüklük değer değildir; import'lar ve biçimlendirmeler 90. yüzdeliği belirler |
|
|
133
|
+
| Ortak yazarlı commit'ler | başkalarının `Co-authored-by` satırında yazarı andığı commit'ler | bu satırları merge eden yazar; eksik ya da yanlış olabilir |
|
|
134
|
+
| Yokluk faktörü | commit'lerin yarısını kapsayan en küçük yazar kümesi (CHAOSS) ve yazarın sırası | birleştirilmemiş birden çok e-posta birden çok kişi sayılır |
|
|
135
|
+
| Yapay zeka destekli commit'ler | satırlarında ya da adında Claude, Cursor, Copilot, Codex, Gemini, ChatGPT, Aider, Devin ya da Windsurf beyan eden yazar commit'leri | eksik bir beyan, yardımsız yazıldığının kanıtı değildir |
|
|
136
|
+
| Hayatta kalan satırlar | HEAD'de yaşayan satırların payı; deterministik dosya örneği üzerinde tek `git blame -w -M` geçişi, `.git-blame-ignore-revs` dikkate alınır | liyakat; bilerek silinen kod kimseye sayılmaz |
|
|
137
|
+
| Yıla göre hayatta kalma | yazarın hayatta kalan satırları, onlara son dokunan commit'in yılına göre | yeni yıllar ölmek için daha az zaman bulmuştur |
|
|
86
138
|
|
|
87
139
|
## Doğrulama nasıl çalışır
|
|
88
140
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
141
|
+
Üç komut; okuyanın elinde olması gerekenlere göre artan sırada.
|
|
142
|
+
|
|
143
|
+
- `workproof check report.json` için yalnızca dosya gerekir. Belgeyi
|
|
144
|
+
[schema/report.schema.json](schema/report.schema.json) ile doğrular ve hash'i yeniden
|
|
145
|
+
hesaplar: parametreler ile figürlerin [RFC 8785](https://www.rfc-editor.org/rfc/rfc8785)
|
|
146
|
+
kanonik JSON'u üzerinde sha256. Değiştirilmiş bir figür `hash mismatch: report says X,
|
|
147
|
+
content hashes to Y` basar ve 1 ile çıkar. Git yok, ağ yok.
|
|
148
|
+
- `workproof verify report.json` için depo gerekir. Önce `check` çalıştırır, parmak izini
|
|
149
|
+
karşılaştırır (`--fingerprint-key` ile; onsuz karşılaştırmayı atlar ve bunu söyler),
|
|
150
|
+
HEAD'i karşılaştırır, sonra her figürü yeniden hesaplayıp farkları basar. Başka bir depodan
|
|
151
|
+
gelen rapor parmak izinde durur. HEAD rapordan beri ilerlediyse bunu söyler ve hangi
|
|
152
|
+
figürlerin değiştiğini gösterir.
|
|
153
|
+
- `workproof attest report.json`, konusu rapor hash'i olan bir [in-toto](https://in-toto.io)
|
|
154
|
+
v1 beyanı olarak `report.intoto.json` yazar; beyanın yüklemi araç sürümünü, parametreleri,
|
|
155
|
+
HEAD'i, anahtarlı parmak izini, git sürümünü ve dışlama sayılarını taşır, başka hiçbir
|
|
156
|
+
şeyi: figür yok, remote yok, yol yok, e-posta yok. `--local ~/.ssh/id_ed25519` beyanı
|
|
157
|
+
`ssh-keygen -Y sign` ile `workproof` ad alanında imzalar; ayrık imzayı ve bir DSSE zarfını
|
|
158
|
+
yazar. Açık anahtarınıza sahip herkes şöyle kontrol eder:
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
ssh-keygen -Y verify -f allowed_signers -I you@example.com -n workproof \
|
|
162
|
+
-s workproof-report.intoto.json.sig < workproof-report.intoto.json
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
`allowed_signers` tek satırdır, `you@example.com ssh-ed25519 AAAA...`; anahtar,
|
|
166
|
+
GitHub'ın `https://github.com/<you>.keys` adresinde sunduğu anahtardır.
|
|
167
|
+
|
|
168
|
+
GitHub Action'da `attest: "true"` aynı beyanı [Sigstore](https://www.sigstore.dev) ile
|
|
169
|
+
anahtarsız imzalar: cosign SHA ile sabitlenmiş bir action'dan kurulur ve
|
|
170
|
+
`cosign attest-blob`, `workproof-report.sigstore.json` dosyasını yazar. Okuyan şöyle
|
|
171
|
+
doğrular:
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
cosign verify-blob-attestation workproof-report.json \
|
|
175
|
+
--bundle workproof-report.sigstore.json \
|
|
176
|
+
--type https://workproof.dev/attestation/v1 \
|
|
177
|
+
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
|
|
178
|
+
--certificate-identity-regexp '^https://github.com/<owner>/<repo>/'
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Bunun kanıtladığı: bu JSON tam olarak o depoda, o commit'te çalışan bir iş akışı tarafından
|
|
182
|
+
üretildi ve o zamandan beri değişmedi. Kanıtlamadığı: figürlerin doğru olduğu (bunun için
|
|
183
|
+
`verify` çalıştırın) ya da iş akışının hangi depoyu çektiği konusunda dürüst olduğu. Açmadan
|
|
184
|
+
önce iki uyarı. Fulcio sertifikası iş akışının çalıştığı depoyu adıyla anar ve Rekor
|
|
185
|
+
şeffaflık günlüğü herkese açık ve kalıcıdır. Özel kod için belgelenen kalıp, raporu tutan ve
|
|
186
|
+
attest adımını çalıştıran küçük bir açık depodur; böylece özel deponun adı günlüğe hiç
|
|
187
|
+
ulaşmaz.
|
|
97
188
|
|
|
98
189
|
## Gizlilik
|
|
99
190
|
|
|
100
191
|
- Kod içeriği, asla. Araç `git log --numstat` ve `git blame` okur ve sayılar üretir.
|
|
101
192
|
- Varsayılan olarak dosya yolu yok. `--paths`, yapılandırılan `--depth` (varsayılan 2)
|
|
102
193
|
derinliğinde dizin adları ekler, dosya asla.
|
|
103
|
-
- Varsayılan olarak e-posta adresi yok. `--emails` ekler; onsuz, yazdığınız `--author`
|
|
104
|
-
|
|
194
|
+
- Varsayılan olarak e-posta adresi yok. `--emails` ekler; onsuz, yazdığınız `--author` bile
|
|
195
|
+
saklanan parametrelerde `(email hidden)` ile değiştirilir. GitHub noreply adresleri
|
|
196
|
+
(`<id>+<login>@users.noreply.github.com`) bayrak olsun olmasın asla yazılmaz, çünkü
|
|
197
|
+
kullanıcı adı adresin içindedir.
|
|
198
|
+
- Konu dışı kişilerin adları asla yazılmaz. Yokluk faktörü figürü yalnızca sayı taşır.
|
|
199
|
+
- Parmak izi, rapor başına üretilen 16 baytlık bir anahtarla `HMAC-SHA256(anahtar, kök commit
|
|
200
|
+
+ remote)` değeridir. Anahtar bir kez basılır ve hiçbir yerde saklanmaz; böylece açık bir
|
|
201
|
+
depo parmak izinden geri bulunamaz. Aynı deponun raporlarında anahtarı yeniden kullanmak
|
|
202
|
+
için `--fingerprint-key` verin.
|
|
105
203
|
- İsteğe bağlı anlatı (`--narrate`) figürleri, yalnızca figürleri, seçtiğiniz bir model uç
|
|
106
|
-
noktasına gönderir (`WORKPROOF_API_URL`, `WORKPROOF_API_KEY`, `WORKPROOF_MODEL`;
|
|
107
|
-
|
|
108
|
-
|
|
204
|
+
noktasına gönderir (`WORKPROOF_API_URL`, `WORKPROOF_API_KEY`, `WORKPROOF_MODEL`; OpenAI
|
|
205
|
+
uyumlu ya da Anthropic). Paragraf "Generated narrative (not verified)" başlığı altına
|
|
206
|
+
eklenir ve hash'in dışındadır.
|
|
109
207
|
|
|
110
208
|
## Seçenekler
|
|
111
209
|
|
|
112
210
|
```
|
|
113
211
|
workproof [options] [--repo <dir>]...
|
|
114
|
-
workproof
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
--
|
|
119
|
-
--
|
|
120
|
-
--
|
|
121
|
-
--
|
|
122
|
-
--
|
|
123
|
-
--
|
|
124
|
-
--
|
|
125
|
-
--
|
|
126
|
-
--
|
|
212
|
+
workproof check <report.json>
|
|
213
|
+
workproof verify <report.json> [--repo <dir>]... [--fingerprint-key <hex>]
|
|
214
|
+
workproof attest <report.json> [--local <ssh-key>]
|
|
215
|
+
|
|
216
|
+
--author <email|name> identity to report on (repeatable; default: git config user.email)
|
|
217
|
+
--repo <dir> repository to analyse (repeatable; several produce one combined report)
|
|
218
|
+
--since / --until override the tenure window
|
|
219
|
+
--sample <n> blame every n-th file (default: 1; 7 for very large repositories)
|
|
220
|
+
--seed <text> salt for the blame file sample
|
|
221
|
+
--exclude <glob> also drop files matching the glob (repeatable)
|
|
222
|
+
--no-exclusions count bot commits and generated, vendored, lock and snapshot files
|
|
223
|
+
--copies pass -C to git blame so copied lines follow their origin
|
|
224
|
+
--ignore-revs-file <f> blame ignore-revs file (default: .git-blame-ignore-revs at the root)
|
|
225
|
+
--fingerprint-key <hex> reuse a fingerprint key so two reports of one repository match
|
|
226
|
+
--max-commits <n> read only the newest n commits (escape hatch for enormous histories)
|
|
227
|
+
--depth <n> directory depth for ownership (default: 2)
|
|
228
|
+
--paths include directory paths
|
|
229
|
+
--emails include author emails
|
|
230
|
+
--narrate append a model-written paragraph
|
|
231
|
+
--badge also write <out>.badge.json, a shields.io endpoint document
|
|
232
|
+
--out <basename> output basename (default: workproof-report)
|
|
233
|
+
--format <mode> write markdown, json, or both (default: both); json prints to stdout
|
|
234
|
+
--json same as --format json
|
|
127
235
|
```
|
|
128
236
|
|
|
129
237
|
Depodaki bir `.mailmap`, bir yazarın birden çok adresini birleştirir. Geçmiş okunurken ve
|
|
130
|
-
dosyalar blame'lenirken ilerleme satırları stderr'e gider
|
|
131
|
-
|
|
132
|
-
|
|
238
|
+
dosyalar blame'lenirken ilerleme satırları stderr'e gider. Her git çağrısı
|
|
239
|
+
`diff.renames=true`, `diff.algorithm=myers`, `diff.indentHeuristic=true` ve
|
|
240
|
+
`core.autocrlf=false` ile çalışır; rapor git sürümünü, blame bayraklarını, ignore-revs
|
|
241
|
+
dosyasını ve tohumu kaydeder. Böylece farklı varsayılanlara sahip iki makine aynı sonucu verir
|
|
242
|
+
ve `verify` bir ortam farkını bir düzenlemeden ayırt edebilir.
|
|
243
|
+
|
|
244
|
+
## Rozet
|
|
133
245
|
|
|
134
|
-
|
|
246
|
+
`--badge`, raporun yanına [shields.io endpoint biçiminde](https://shields.io/badges/endpoint-badge)
|
|
247
|
+
`workproof-report.badge.json` yazar:
|
|
135
248
|
|
|
136
|
-
|
|
249
|
+
```json
|
|
250
|
+
{ "schemaVersion": 1, "label": "workproof", "message": "70.6% surviving lines · 60 days", "color": "1f3fbf" }
|
|
251
|
+
```
|
|
137
252
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
253
|
+
Açık bir depoya (portfolyonuz, bir gist) commit'leyin ve shields'ı ham URL'ye yönlendirin:
|
|
254
|
+
|
|
255
|
+
```
|
|
256
|
+

|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Rozet bir iddiadır, kanıt değil. JSON raporu yanında tutun; okuyanın doğruladığı rapordur,
|
|
260
|
+
rozet yalnızca onu bulma yoludur.
|
|
261
|
+
|
|
262
|
+
## GitHub Action
|
|
263
|
+
|
|
264
|
+
Depo, bir checkout üzerinde workproof'u çalıştıran, `check` yapan, in-toto beyanını yazan ve
|
|
265
|
+
pull request'e başlık figürleriyle tek bir yapışkan yorum bırakan bir composite action
|
|
266
|
+
içerir. `fetch-depth: 0` zorunludur, yoksa figürlerin geldiği geçmiş eksiktir; `author`
|
|
267
|
+
zorunludur, çünkü bir GitHub kullanıcı adı commit kimliklerine güvenilir biçimde eşlenmez.
|
|
268
|
+
|
|
269
|
+
```yaml
|
|
270
|
+
name: workproof
|
|
271
|
+
on:
|
|
272
|
+
pull_request:
|
|
273
|
+
permissions:
|
|
274
|
+
contents: read
|
|
275
|
+
pull-requests: write
|
|
276
|
+
id-token: write # only for attest: "true"
|
|
277
|
+
jobs:
|
|
278
|
+
report:
|
|
279
|
+
runs-on: ubuntu-latest
|
|
280
|
+
steps:
|
|
281
|
+
- uses: actions/checkout@v4
|
|
282
|
+
with:
|
|
283
|
+
fetch-depth: 0
|
|
284
|
+
- uses: actions/setup-node@v4
|
|
285
|
+
with:
|
|
286
|
+
node-version: 22
|
|
287
|
+
- uses: Bubblegunn/workproof@v0
|
|
288
|
+
with:
|
|
289
|
+
author: ada@example.com
|
|
290
|
+
sample: "1"
|
|
291
|
+
attest: "false"
|
|
292
|
+
```
|
|
148
293
|
|
|
149
|
-
|
|
294
|
+
`@v0`, bakımcının her 0.x sürümünde en yeniye taşıdığı hareketli bir etikettir; action'ın
|
|
295
|
+
altınızda hiç değişmemesini istiyorsanız bir commit SHA'sına sabitleyin. Girdiler kabuğa
|
|
296
|
+
ortam değişkenleriyle ulaşır, betiğe hiçbir zaman yerleştirilmez. Yorum sonraki push'larda
|
|
297
|
+
yerinde güncellenir (bir işaret taşır) ve `workproof-report.json`, `.intoto.json` ile
|
|
298
|
+
`.predicate.json` bir `upload-artifact` adımı için çalışma alanında kalır. Yalnızca dosyaları
|
|
299
|
+
üretmek için `comment: "false"` verin.
|
|
300
|
+
|
|
301
|
+
## Oyun ve yanlılık
|
|
302
|
+
|
|
303
|
+
Kısmen oyunlanabilir; rapor, oyunun görünmesi için tasarlandı. Bir sayıya güvenmeden önce
|
|
304
|
+
okuyanın bilmesi gereken on üç şey.
|
|
305
|
+
|
|
306
|
+
1. Commit spam'i commit payını ve tempoyu oynatır, başka bir şeyi değil. Hayatta kalan
|
|
307
|
+
satırlar HEAD'deki `git blame`'den gelir; bin boş commit sıfır hayatta kalan satır ekler
|
|
308
|
+
ve iki pay yan yana basılır.
|
|
309
|
+
2. Bir kütüphaneyi vendor'lamak eklenen satırları şişirir. Vendored dizinler, kilit
|
|
310
|
+
dosyaları, snapshot'lar, küçültülmüş varlıklar ve üretilmiş çıktılar yerleşik listelerle ve
|
|
311
|
+
`.gitattributes` içindeki `linguist-generated` ya da `linguist-vendored` ile dışlanır;
|
|
312
|
+
rapor ne kadarının dışlandığını basar. Listelerin kaçırdığı yine sayılır; `--exclude` onu
|
|
313
|
+
kapsar ve glob parametrelere kaydedilir.
|
|
314
|
+
3. Bot commit'leri (`dependabot[bot]`, `renovate[bot]`, GitHub uygulama kimlikleri) her
|
|
315
|
+
paydadan çıkar. İnsan gibi adı olan bir bot tespit edilmez; sezgisel yöntem yoktur.
|
|
316
|
+
4. Bir biçimlendirme commit'i, `.git-blame-ignore-revs` içinde listelenmediyse dokunduğu her
|
|
317
|
+
satırı alır. Rapor hangi dosyanın kullanıldığını ya da hiç kullanılmadığını söyler.
|
|
318
|
+
5. `--since`, `--until`, `--sample`, `--seed` ve `--exclude` hepsi göze hoş görünen bir
|
|
319
|
+
pencere ya da örnek seçme yoludur. Her biri parametrelerde saklanır ve hash'lenir.
|
|
320
|
+
6. Yazarlığı değiştirmek için geçmişi yeniden yazmak kök commit'i ya da HEAD'i değiştirir;
|
|
321
|
+
eski bir rapordaki parmak izi ve HEAD eşleşmez olur.
|
|
322
|
+
7. Yazarlık derecesi başka sistemlerde uydurulmuş katsayılar kullanır. İlk yazarlık sonraki
|
|
323
|
+
yeniden yazımlardan ağır basar; başkasının sıfırdan yeniden yazdığı bir dosya ilk yazarında
|
|
324
|
+
kalabilir.
|
|
325
|
+
8. `Co-authored-by` satırlarını merge eden yazar. Eksik, yanlış ya da bir squash-merge
|
|
326
|
+
arayüzünün eklediği olabilir; satırsız eşli çalışma görünmezdir.
|
|
327
|
+
9. Yapay zeka destekli demek, bir satır ya da yazar adı öyle demiş demektir. Satırın
|
|
328
|
+
yokluğu yardımsız yazıldığının kanıtı değildir; blame her satırı insana yazar, dolayısıyla
|
|
329
|
+
yazarlık artık anlamayı ima etmez. Bu commit'ler başka hiçbir figürden dışlanmaz.
|
|
330
|
+
10. Yokluk faktörü e-posta adresi sayar. Birleştirilmemiş birden çok adresi olan bir yazar
|
|
331
|
+
birden çok kişi sayılır; bir `.mailmap` ekleyin.
|
|
332
|
+
11. Oluşturulan dokümanlar, en eski commit'i yazara ait dosyaları sayar. Tek satırlık bir
|
|
333
|
+
README ile bir tasarım belgesi aynı sayılır.
|
|
334
|
+
12. Test dosyası değişiklikleri, test yollarıyla eşleşen dosya değişiklikleridir; test
|
|
335
|
+
vakası, assertion ya da kapsam değildir.
|
|
336
|
+
13. Doğrulayıcı aynı depoya karşı çalışır. Yeniden üretilemeyen bir rapor, hiç rapor
|
|
337
|
+
olmamasından kötüdür; aracın dayandığı teşvik budur. Hiçbir figürün yakalamadığı:
|
|
338
|
+
gerçekten büyük ama düşük değerli bir katkı. Referanslar bunun içindir.
|
|
150
339
|
|
|
151
340
|
## Adaylar için
|
|
152
341
|
|
|
153
342
|
Gurur duyduğunuz ve gösteremediğiniz her depoda çalıştırın. Markdown'ı portfolyonuza, zaten
|
|
154
343
|
yazacağınız cümlenin ("frontend'i ben yaptım") yanına koyun ve sayılar cümleyi taşısın. JSON'u
|
|
155
|
-
saklayın; inceleyenin doğruladığı
|
|
344
|
+
ve parmak izi anahtarını saklayın; inceleyenin doğruladığı JSON'dur.
|
|
156
345
|
|
|
157
346
|
## İşe alanlar için
|
|
158
347
|
|
|
159
|
-
JSON'u
|
|
160
|
-
|
|
161
|
-
değiştiğini ve bunun
|
|
348
|
+
JSON'u isteyin. `npx workproof check` bir saniyede düzenlenip düzenlenmediğini söyler. Sonra
|
|
349
|
+
adayın eski şirketinden birinin üzerinde `npx workproof verify` çalıştırmasını isteyin. Tablo
|
|
350
|
+
ya yeniden üretilir ya üretilmez. Depo ilerlediyse araç hangi figürlerin değiştiğini ve bunun
|
|
351
|
+
neden beklendiğini söyler.
|
|
162
352
|
|
|
163
353
|
## Vize ve göç kanıtı için
|
|
164
354
|
|
|
165
355
|
workproof, en güçlü işin özel depolarda olduğu ve "bana güven"in kanıt sayılmadığı bir
|
|
166
356
|
Birleşik Krallık Global Talent başvurusu için yapıldı. Bir rapor, yöntemi ekli bir ölçümdür,
|
|
167
|
-
bir tavsiye değil; orada bulunmuş insanların mektuplarıyla
|
|
357
|
+
bir tavsiye değil; orada bulunmuş insanların mektuplarıyla ve okuyan depoya ulaşamıyorsa bir
|
|
358
|
+
attestation ile birlikte kullanın.
|
|
168
359
|
|
|
169
360
|
## Bunu yapmaz
|
|
170
361
|
|
|
@@ -175,8 +366,10 @@ Hayatta kalmayı ve etkinliği ölçer; kaliteyi, incelemeyi, tasarımı ya da m
|
|
|
175
366
|
|
|
176
367
|
Yöntem
|
|
177
368
|
[How to show engineering ownership when the repositories are private](https://efe-genc-portfolio.vercel.app/writing/showing-ownership-private-repositories/)
|
|
178
|
-
yazısında anlatılıyor.
|
|
179
|
-
[surviving-lines](https://github.com/Bubblegunn/surviving-lines)
|
|
369
|
+
yazısında anlatılıyor. Örnekleyici ve glob yardımcıları workproof'un tek bağımlılığı olan
|
|
370
|
+
[surviving-lines](https://github.com/Bubblegunn/surviving-lines) paketinden gelir. Yazarlık
|
|
371
|
+
derecesi Avelino, Hora ve Valente (2016), ana katkıcı Bird ve ark. (2011), yokluk faktörü
|
|
372
|
+
CHAOSS Contributor Absence Factor tanımını izler.
|
|
180
373
|
|
|
181
374
|
## Geliştirme
|
|
182
375
|
|
package/dist/src/analyse.d.ts
CHANGED
|
@@ -11,6 +11,18 @@ export interface Params {
|
|
|
11
11
|
emails: boolean;
|
|
12
12
|
/** Escape hatch for enormous histories: read only the newest n commits. */
|
|
13
13
|
maxCommits?: number;
|
|
14
|
+
/** Drop bot commits and generated, vendored, lock and snapshot files (default true). */
|
|
15
|
+
exclusions?: boolean;
|
|
16
|
+
/** Extra globs to drop, with surviving-lines semantics. */
|
|
17
|
+
exclude?: string[];
|
|
18
|
+
/** Salt for the blame file sample. */
|
|
19
|
+
seed?: string;
|
|
20
|
+
/** Pass -C to git blame so copied lines follow their origin. */
|
|
21
|
+
copies?: boolean;
|
|
22
|
+
/** A blame ignore-revs file other than .git-blame-ignore-revs at the root. */
|
|
23
|
+
ignoreRevsFile?: string;
|
|
24
|
+
/** Key for the repository fingerprint; generated per report when absent. */
|
|
25
|
+
fingerprintKey?: string;
|
|
14
26
|
}
|
|
15
27
|
export interface AnalyseHooks {
|
|
16
28
|
/** Called with short status lines while history is read and files are blamed. */
|
|
@@ -20,13 +32,38 @@ export interface RepoReport {
|
|
|
20
32
|
name: string;
|
|
21
33
|
head: string;
|
|
22
34
|
fingerprint: string;
|
|
35
|
+
/** True when the fingerprint is an HMAC under a key the report does not carry. */
|
|
36
|
+
fingerprintKeyed?: boolean;
|
|
23
37
|
identity: {
|
|
24
38
|
emails: string[];
|
|
25
39
|
names: string[];
|
|
26
40
|
count: number;
|
|
27
41
|
};
|
|
42
|
+
/** What the figures were computed with, so a verifier can tell a drift from an edit. */
|
|
43
|
+
environment: {
|
|
44
|
+
git: string;
|
|
45
|
+
blame: string[];
|
|
46
|
+
ignoreRevs: string | null;
|
|
47
|
+
seed: string;
|
|
48
|
+
};
|
|
49
|
+
/** What left the denominators before any figure was computed. */
|
|
50
|
+
excluded: {
|
|
51
|
+
botCommits: number;
|
|
52
|
+
files: number;
|
|
53
|
+
linesAddedShare: number;
|
|
54
|
+
enabled: boolean;
|
|
55
|
+
};
|
|
28
56
|
figures: Figure<any>[];
|
|
29
57
|
}
|
|
30
|
-
/**
|
|
31
|
-
export declare
|
|
58
|
+
/** A fresh 16-byte fingerprint key as hex. Printed once, stored nowhere. */
|
|
59
|
+
export declare const newFingerprintKey: () => string;
|
|
60
|
+
/** GitHub noreply addresses carry the login in the local part, so they are never written out. */
|
|
61
|
+
export declare const publicEmail: (email: string) => string;
|
|
62
|
+
/**
|
|
63
|
+
* Identifies a repository without naming it. Keyed: HMAC-SHA256 under a per-report key of
|
|
64
|
+
* the root commit and the normalised remote, so a reader cannot look a public repository
|
|
65
|
+
* up from its fingerprint. Unkeyed (no key given): plain sha256, kept for callers that
|
|
66
|
+
* want a stable public identifier.
|
|
67
|
+
*/
|
|
68
|
+
export declare function fingerprint(root: string, remote: string, key?: string): string;
|
|
32
69
|
export declare function analyseRepo(cwd: string, params: Params, hooks?: AnalyseHooks): Promise<RepoReport>;
|