@vibe-validate/history 0.17.0-rc4 → 0.17.1-rc.1
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 +68 -0
- package/dist/pruner.d.ts.map +1 -1
- package/dist/pruner.js +34 -52
- package/dist/pruner.js.map +1 -1
- package/dist/reader.js +3 -3
- package/dist/reader.js.map +1 -1
- package/dist/recorder.d.ts.map +1 -1
- package/dist/recorder.js +3 -3
- package/dist/recorder.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -4,6 +4,7 @@ Validation history tracking via git notes for vibe-validate.
|
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
|
+
- **Automatic Work Protection**: Every validation creates recoverable snapshots of all files
|
|
7
8
|
- **Git Notes Storage**: Store validation results keyed by git tree hash
|
|
8
9
|
- **Distributed Cache**: Remember validation for EVERY tree hash
|
|
9
10
|
- **Worktree Stability Check**: Verify tree unchanged during validation
|
|
@@ -228,6 +229,73 @@ await recordValidationHistory(treeHashBefore, result);
|
|
|
228
229
|
|
|
229
230
|
**Sharing**: Local by default (no auto-push to remote)
|
|
230
231
|
|
|
232
|
+
## Work Protection
|
|
233
|
+
|
|
234
|
+
Every validation run that records history also provides automatic work protection.
|
|
235
|
+
|
|
236
|
+
### How Validation History Enables Recovery
|
|
237
|
+
|
|
238
|
+
Each history entry stores:
|
|
239
|
+
- `treeHash`: The git tree hash for that validation
|
|
240
|
+
- `timestamp`: When validation occurred
|
|
241
|
+
- `branch`: Which branch you were on
|
|
242
|
+
- `headCommit`: Last commit at validation time
|
|
243
|
+
- `uncommittedChanges`: Whether you had uncommitted work
|
|
244
|
+
|
|
245
|
+
The `treeHash` is the key to recovery - it references a git tree object containing all your files as they existed during that validation.
|
|
246
|
+
|
|
247
|
+
### Recovery Workflow
|
|
248
|
+
|
|
249
|
+
1. **Find the validation** you want to recover from:
|
|
250
|
+
```bash
|
|
251
|
+
vv history list
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
2. **Examine the tree hash** to see what files existed:
|
|
255
|
+
```bash
|
|
256
|
+
git ls-tree <tree-hash>
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
3. **View specific file content**:
|
|
260
|
+
```bash
|
|
261
|
+
git cat-file -p <tree-hash>:path/to/file.ts
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
4. **Recover files**:
|
|
265
|
+
```bash
|
|
266
|
+
# Single file
|
|
267
|
+
git cat-file -p <tree-hash>:src/feature.ts > src/feature.ts
|
|
268
|
+
|
|
269
|
+
# Entire directory
|
|
270
|
+
git checkout <tree-hash> -- src/
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Example: Recovering from Accidental Loss
|
|
274
|
+
|
|
275
|
+
```typescript
|
|
276
|
+
// You were working on new features (unstaged)
|
|
277
|
+
// Accidentally ran `git restore .`
|
|
278
|
+
// Work is gone from file system!
|
|
279
|
+
|
|
280
|
+
// But history remembers:
|
|
281
|
+
const notes = await readHistoryNote(currentTreeHash);
|
|
282
|
+
console.log(`Last validation: ${notes.runs[0].timestamp}`);
|
|
283
|
+
console.log(`Tree hash: ${notes.treeHash}`);
|
|
284
|
+
|
|
285
|
+
// Recover via git:
|
|
286
|
+
// git cat-file -p <tree-hash>:src/lost-work.ts
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### Privacy Implications
|
|
290
|
+
|
|
291
|
+
Work protection does NOT increase privacy risks:
|
|
292
|
+
- Git objects are local (not pushed unless you explicitly push git notes)
|
|
293
|
+
- Only files already tracked or trackable are protected
|
|
294
|
+
- .gitignore is respected (secrets stay ignored)
|
|
295
|
+
- Tree hashes are content-based (no PII)
|
|
296
|
+
|
|
297
|
+
See [Work Protection Guide](../../docs/work-protection.md) for comprehensive examples.
|
|
298
|
+
|
|
231
299
|
## Future Extensions
|
|
232
300
|
|
|
233
301
|
- Team sharing (opt-in)
|
package/dist/pruner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pruner.d.ts","sourceRoot":"","sources":["../src/pruner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"pruner.d.ts","sourceRoot":"","sources":["../src/pruner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAwB7D;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,aAAa,EAAE,MAAM,EACrB,MAAM,GAAE,aAAkB,EAC1B,MAAM,GAAE,OAAe,GACtB,OAAO,CAAC,WAAW,CAAC,CA4CtB;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,MAAM,GAAE,aAAkB,EAC1B,MAAM,GAAE,OAAe,GACtB,OAAO,CAAC,WAAW,CAAC,CA8BtB;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,GAAE,OAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAkCpF;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,GAAE,OAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CA8BpF"}
|
package/dist/pruner.js
CHANGED
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* History pruning utilities
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { removeNote, removeNotesRefs } from '@vibe-validate/git';
|
|
5
5
|
import { DEFAULT_HISTORY_CONFIG } from './types.js';
|
|
6
6
|
import { getAllHistoryNotes } from './reader.js';
|
|
7
7
|
import { listRunCacheTreeHashes, getAllRunCacheForTree } from './run-cache-reader.js';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
// Removed: Git operations now use secure @vibe-validate/git functions
|
|
9
|
+
/**
|
|
10
|
+
* Merge user config with defaults
|
|
11
|
+
*/
|
|
12
|
+
function mergeConfig(config = {}) {
|
|
13
|
+
const mergedGitNotes = config.gitNotes
|
|
14
|
+
? { ...DEFAULT_HISTORY_CONFIG.gitNotes, ...config.gitNotes }
|
|
15
|
+
: DEFAULT_HISTORY_CONFIG.gitNotes;
|
|
16
|
+
return {
|
|
17
|
+
...DEFAULT_HISTORY_CONFIG,
|
|
18
|
+
...config,
|
|
19
|
+
gitNotes: mergedGitNotes,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
14
22
|
/**
|
|
15
23
|
* Prune validation history older than specified days
|
|
16
24
|
*
|
|
@@ -20,14 +28,7 @@ const GIT_OPTIONS = {
|
|
|
20
28
|
* @returns Prune result
|
|
21
29
|
*/
|
|
22
30
|
export async function pruneHistoryByAge(olderThanDays, config = {}, dryRun = false) {
|
|
23
|
-
const mergedConfig =
|
|
24
|
-
...DEFAULT_HISTORY_CONFIG,
|
|
25
|
-
...config,
|
|
26
|
-
gitNotes: {
|
|
27
|
-
...DEFAULT_HISTORY_CONFIG.gitNotes,
|
|
28
|
-
...config.gitNotes,
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
+
const mergedConfig = mergeConfig(config);
|
|
31
32
|
const notesRef = mergedConfig.gitNotes.ref;
|
|
32
33
|
const cutoffTime = Date.now() - olderThanDays * 24 * 60 * 60 * 1000;
|
|
33
34
|
let notesPruned = 0;
|
|
@@ -48,12 +49,8 @@ export async function pruneHistoryByAge(olderThanDays, config = {}, dryRun = fal
|
|
|
48
49
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
49
50
|
const treeHash = note.treeHash;
|
|
50
51
|
if (!dryRun) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
// Ignore errors (note might not exist)
|
|
56
|
-
}
|
|
52
|
+
// Use secure removeNote function (no command injection risk)
|
|
53
|
+
removeNote(notesRef, treeHash);
|
|
57
54
|
}
|
|
58
55
|
notesPruned++;
|
|
59
56
|
runsPruned += note.runs.length;
|
|
@@ -75,14 +72,7 @@ export async function pruneHistoryByAge(olderThanDays, config = {}, dryRun = fal
|
|
|
75
72
|
* @returns Prune result
|
|
76
73
|
*/
|
|
77
74
|
export async function pruneAllHistory(config = {}, dryRun = false) {
|
|
78
|
-
const mergedConfig =
|
|
79
|
-
...DEFAULT_HISTORY_CONFIG,
|
|
80
|
-
...config,
|
|
81
|
-
gitNotes: {
|
|
82
|
-
...DEFAULT_HISTORY_CONFIG.gitNotes,
|
|
83
|
-
...config.gitNotes,
|
|
84
|
-
},
|
|
85
|
-
};
|
|
75
|
+
const mergedConfig = mergeConfig(config);
|
|
86
76
|
const notesRef = mergedConfig.gitNotes.ref;
|
|
87
77
|
const allNotes = await getAllHistoryNotes(notesRef);
|
|
88
78
|
let notesPruned = 0;
|
|
@@ -93,12 +83,8 @@ export async function pruneAllHistory(config = {}, dryRun = false) {
|
|
|
93
83
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
94
84
|
const treeHash = note.treeHash;
|
|
95
85
|
if (!dryRun) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
}
|
|
99
|
-
catch {
|
|
100
|
-
// Ignore errors
|
|
101
|
-
}
|
|
86
|
+
// Use secure removeNote function (no command injection risk)
|
|
87
|
+
removeNote(notesRef, treeHash);
|
|
102
88
|
}
|
|
103
89
|
notesPruned++;
|
|
104
90
|
runsPruned += note.runs?.length ?? 0;
|
|
@@ -132,12 +118,8 @@ export async function pruneLegacyNotes(dryRun = false) {
|
|
|
132
118
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
133
119
|
const treeHash = note.treeHash;
|
|
134
120
|
if (!dryRun) {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}
|
|
138
|
-
catch {
|
|
139
|
-
// Ignore errors
|
|
140
|
-
}
|
|
121
|
+
// Use secure removeNote function (no command injection risk)
|
|
122
|
+
removeNote(legacyRef, treeHash);
|
|
141
123
|
}
|
|
142
124
|
notesPruned++;
|
|
143
125
|
runsPruned += note.runs?.length ?? 0;
|
|
@@ -166,19 +148,19 @@ export async function pruneAllRunCache(dryRun = false) {
|
|
|
166
148
|
const prunedTreeHashes = [];
|
|
167
149
|
for (const treeHash of treeHashes) {
|
|
168
150
|
const entries = await getAllRunCacheForTree(treeHash);
|
|
169
|
-
if (entries.length
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
execSync(`git for-each-ref --format="%(refname)" refs/notes/vibe-validate/run/${treeHash}/ | xargs -I {} git update-ref -d {}`, { ...GIT_OPTIONS, stdio: 'ignore' });
|
|
174
|
-
}
|
|
175
|
-
catch {
|
|
176
|
-
// Ignore errors
|
|
177
|
-
}
|
|
178
|
-
}
|
|
151
|
+
if (entries.length === 0) {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (dryRun) {
|
|
179
155
|
notesPruned += entries.length;
|
|
180
|
-
prunedTreeHashes.push(treeHash);
|
|
181
156
|
}
|
|
157
|
+
else {
|
|
158
|
+
// SECURITY FIX: Use secure removeNotesRefs instead of shell piping
|
|
159
|
+
// This eliminates command injection risk from treeHash variable
|
|
160
|
+
const deleted = removeNotesRefs(`refs/notes/vibe-validate/run/${treeHash}`);
|
|
161
|
+
notesPruned += deleted;
|
|
162
|
+
}
|
|
163
|
+
prunedTreeHashes.push(treeHash);
|
|
182
164
|
}
|
|
183
165
|
return {
|
|
184
166
|
notesPruned,
|
package/dist/pruner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pruner.js","sourceRoot":"","sources":["../src/pruner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"pruner.js","sourceRoot":"","sources":["../src/pruner.ts"],"names":[],"mappings":"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"}
|
package/dist/reader.js
CHANGED
|
@@ -27,16 +27,16 @@ export async function readHistoryNote(treeHash, notesRef = 'vibe-validate/valida
|
|
|
27
27
|
return null;
|
|
28
28
|
}
|
|
29
29
|
// Validate each ValidationResult in runs array using safe validation
|
|
30
|
+
// Silently skip corrupted entries (e.g., legacy 0/0 line/column from rc.9)
|
|
31
|
+
// After upgrading vibe-validate, run 'vv doctor' to check for issues
|
|
32
|
+
// Users can optionally cleanup old history with: vv history prune --all
|
|
30
33
|
const validatedRuns = [];
|
|
31
34
|
for (const run of parsed.runs) {
|
|
32
35
|
if (!run.result) {
|
|
33
|
-
console.warn(`Run ${run.id} missing result field - skipping`);
|
|
34
36
|
continue;
|
|
35
37
|
}
|
|
36
38
|
const validationResult = safeValidateResult(run.result);
|
|
37
39
|
if (!validationResult.success) {
|
|
38
|
-
console.warn(`Invalid ValidationResult in run ${run.id}:`, validationResult.errors);
|
|
39
|
-
console.warn('Skipping corrupted run entry');
|
|
40
40
|
continue;
|
|
41
41
|
}
|
|
42
42
|
validatedRuns.push({
|
package/dist/reader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGzD,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,WAAW,GAAG;IAClB,QAAQ,EAAE,MAAe;IACzB,OAAO,EAAE,WAAW;IACpB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAA+B;CAChE,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,WAAmB,wBAAwB;IAE3C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CACnB,mBAAmB,QAAQ,SAAS,QAAQ,EAAE,EAC9C,WAAW,CACZ,CAAC;QAEF,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAE/B,oCAAoC;QACpC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAChG,OAAO,CAAC,IAAI,CAAC,sCAAsC,QAAQ,uBAAuB,CAAC,CAAC;YACpF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,qEAAqE;QACrE,MAAM,aAAa,GAAG,EAAE,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;gBAChB,
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"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"}
|
package/dist/recorder.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAGV,YAAY,EACZ,cAAc,EACd,aAAa,EACd,MAAM,YAAY,CAAC;AAuCpB;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,gBAAgB,EACxB,MAAM,GAAE,aAAkB,GACzB,OAAO,CAAC,YAAY,CAAC,CA8FvB;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,cAAc,CAAC,CAQzB"}
|
package/dist/recorder.js
CHANGED
|
@@ -6,7 +6,7 @@ import { writeFileSync, unlinkSync } from 'node:fs';
|
|
|
6
6
|
import { tmpdir } from 'node:os';
|
|
7
7
|
import { join } from 'node:path';
|
|
8
8
|
import { stringify as stringifyYaml } from 'yaml';
|
|
9
|
-
import { getGitTreeHash, hasWorkingTreeChanges } from '@vibe-validate/git';
|
|
9
|
+
import { getGitTreeHash, hasWorkingTreeChanges, getCurrentBranch as getGitBranch, getHeadCommitSha, } from '@vibe-validate/git';
|
|
10
10
|
import { DEFAULT_HISTORY_CONFIG } from './types.js';
|
|
11
11
|
import { truncateValidationOutput } from './truncate.js';
|
|
12
12
|
import { readHistoryNote } from './reader.js';
|
|
@@ -23,7 +23,7 @@ const GIT_OPTIONS = {
|
|
|
23
23
|
*/
|
|
24
24
|
async function getCurrentBranch() {
|
|
25
25
|
try {
|
|
26
|
-
const branch =
|
|
26
|
+
const branch = getGitBranch();
|
|
27
27
|
return branch === 'HEAD' ? 'detached' : branch;
|
|
28
28
|
}
|
|
29
29
|
catch {
|
|
@@ -37,7 +37,7 @@ async function getCurrentBranch() {
|
|
|
37
37
|
*/
|
|
38
38
|
async function getHeadCommit() {
|
|
39
39
|
try {
|
|
40
|
-
return
|
|
40
|
+
return getHeadCommitSha();
|
|
41
41
|
}
|
|
42
42
|
catch {
|
|
43
43
|
return 'none';
|
package/dist/recorder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recorder.js","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,
|
|
1
|
+
{"version":3,"file":"recorder.js","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibe-validate/history",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.1-rc.1",
|
|
4
4
|
"description": "Validation history tracking via git notes for vibe-validate",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"yaml": "^2.3.4",
|
|
41
41
|
"zod": "^3.24.1",
|
|
42
|
-
"@vibe-validate/git": "0.17.
|
|
43
|
-
"@vibe-validate/core": "0.17.
|
|
42
|
+
"@vibe-validate/git": "0.17.1-rc.1",
|
|
43
|
+
"@vibe-validate/core": "0.17.1-rc.1"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@types/node": "^22.0.0",
|